System Atlas

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.

Write · editor keyMCP tool

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[]required
    min 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[].layerenumoptional
    peopleprocesssoftwaredatadecisions
  • 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[].externalKindenumoptional
    customersupplierpartnerregulatoreconomic_factor
  • items[].valuesobject[]optionaldefault []
    max 50 items
  • items[].values[].parameterstringrequired
    min 1 charmax 80 chars
  • items[].values[].valuestring | number | booleanrequired
  • items[].sourceobjectoptional
  • items[].source.kindenumoptionaldefault "client_document"
    client_documentinterviewmanualwebsitefilingregistry
  • items[].source.urlstringoptional
    max 500 chars
  • items[].source.titlestringoptional
    max 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: ….

Response
{
  "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