upload_components
Upload up to 200 components of the company (teams, roles, tools, processes, datasets, rules, outside parties). Each is placed on a primitive (given, existing, matched, model or custom) and stored private, self-reported, draft. Re-uploading a clientId updates it. Returns per-item placement and a coverage summary. Needs an editor key.
Parameters
- workspacestringrequired
Workspace slug
min 1 charmax 80 chars - companystringoptional
Company slug; defaults to the workspace's own company
min 1 charmax 80 chars - itemsobject[]requiredmin 1 itemmax 200 items
- items[].clientIdstringoptional
Your stable id for this thing (e.g. repo path or tool slug). Re-uploading the same clientId updates instead of duplicating.
min 1 charmax 120 charspattern ^[\w.:/@-]+$ - items[].labelstringrequired
The company's own name for it: 'Payroll (Gusto)', 'Platform team'
min 1 charmax 200 chars - items[].descriptionstringoptional
One or two plain sentences: what it is, what it does
max 2000 chars - items[].layerenumoptionalpeopleprocesssoftwaredatadecisions
- items[].primitivestringoptional
Primitive key from get_mapping_guide, if you know it
max 80 chars - items[].parentstringoptional
Parent component: its clientId, label, or component id
min 1 charmax 200 chars - items[].kindenumoptionaldefault "internal"internalexternal
- items[].externalKindenumoptionalcustomersupplierpartnerregulatoreconomic_factor
- items[].valuesobject[]optionaldefault []max 50 items
- items[].values[].parameterstringrequiredmin 1 charmax 80 chars
- items[].values[].valuestring | number | booleanrequired
- items[].sourceobjectoptional
- items[].source.kindenumoptionaldefault "client_document"client_documentinterviewmanualwebsitefilingregistry
- items[].source.urlstringoptionalmax 500 chars
- items[].source.titlestringoptionalmax 200 chars
Example call
Agents call tools by name; you rarely write this by hand. It is here so you can test the server from a shell or your own code.
{
"name": "upload_components",
"arguments": {
"workspace": "acme-builders",
"items": [
{
"clientId": "tool/gusto",
"label": "Payroll in Gusto",
"description": "Runs payroll twice a month for 42 people.",
"layer": "software",
"values": [
{
"parameter": "frequency",
"value": "Monthly"
}
],
"source": {
"kind": "client_document",
"title": "finance/README.md"
}
}
]
}
}Response
The result is one text content block holding this JSON (abbreviated here). Errors come back with isError: true and a message such as Error 401: … or Invalid input: ….
{
"company": {
"slug": "client",
"name": "Acme Builders"
},
"placed": {
"given": 0,
"existing": 0,
"matched": 1,
"model": 0,
"parent": 0,
"custom": 0,
"failed": 0
},
"results": [
{
"clientId": "tool/gusto",
"label": "Payroll in Gusto",
"primitive": "payroll",
"placedBy": "matched",
"confidence": 0.92,
"created": true,
"values": 1
}
],
"summary": {
"components": 85,
"custom": 6,
"coverage": {
"covered": 31,
"baseline": 50,
"percent": 62
},
"topGaps": [
{
"primitive": "job_costing",
"label": "Job costing"
}
]
}
}Over REST
The same call without MCP: POST/api/v1/workspaces/:slug/upload/components