Skip to main content
Glama

add_context

Destructive

Adds a new context item to the team's reference library: reference material (product facts, positioning, competitor notes, web pages) that Marcora uses to ground AI-generated content.

Give a descriptive name, then the body in EXACTLY ONE of three ways (none, or more than one, is rejected):

  1. content: paste the markdown body. Best for short or hand-authored material. Creates a plain text item.

  2. import_url: a public URL imported ONCE. The page is fetched and converted to clean markdown server-side and stored as a static snapshot that cannot be refreshed. Use it for one-off imports (an exported document link, a competitor's blog post).

  3. connected_webpage_url: a URL tracked as a live web page. It is fetched, stored as a "webpage" item, and the URL is remembered so it can be re-pulled later (update_context refresh_webpage, or the refresh button in the app). Use it for the customer's own pages and anything to keep current. If the URL is already tracked, the existing item is UPDATED in place (no duplicate) and its stored content is OVERWRITTEN with the fresh fetch. Requires admin or editor role.

Both URL paths wait for the import, up to about 25 seconds. If the page loads in that time the response has import_status "ready" (get_context_item returns the body). If the page can't be read the call returns an error and nothing is added (a tracked page keeps its saved copy). Only a slow page returns import_status "processing" with a real context item id; for what polling shows and how long to wait, see Polling below.

Optionally pass collection_id (see list_context_collections / create_context_collection) and/or project_id (see list_projects) to create the item there directly. These apply to all three paths.

Present the returned link_url (it opens the new item in the Marcora web app) exactly as returned.

Call transcripts: text that looks like a call transcript (WebVTT or SRT, or lines with speaker labels and timestamps) is saved as a call in Calls, as the Add form does, and the result says so (saved_as_call: true). Pass as_call: true to save any text as a call, or as_call: false to keep it an ordinary context item. A call is Only me (visible only to the person who added it) unless you pass audience: "team"; ask the user if you are unsure who should see it. Optional call details: call_date (ISO 8601), call_kind, call_company; anything left out is worked out from the transcript. A call takes content only. call_date, call_kind, call_company and audience: "only_me" apply to calls only: sending one for text saved as an ordinary item is rejected rather than ignored. The summary is written after the save; call.summary_status shows where it is, and get_context_item returns the summary once ready.

Team audience on ordinary items: when the user asks for the item to be saved for the team, pass audience: "team" (on content, import_url or connected_webpage_url), even with a collection_id or project_id. It is accepted when the item will be team-visible. In a private collection or private project it is refused with an error and nothing is saved: tell the user why and offer a shared collection, a team-visible project or the Reference Library. Never fall back to a private save without asking the user.

Importing calls from a connected app: a fourth way, import_from: { toolkit, call_ids }, brings in calls the user keeps in a call-recording app. Use it instead of content, import_url and connected_webpage_url, and without as_call, call_date, call_kind or call_company. First find the calls with the app's own list or search tool in your session, then pass their ids (1 to 10) in this ONE call: Marcora fetches and cleans each transcript itself through the user's own connection, so never retype or paste a transcript. toolkit is fathom, gong, fireflies, googlemeet or wispr_flow_mcp. Google Meet and Wispr Flow imports are Beta. For Google Meet, pass the bare ID from conferenceRecords/{id}, or doc:{document_id} for a saved transcript. Recent discovery is organizer-only within 30 days; a known conference record still requires access. Saved transcripts require your own active Google Meet and Google Docs connections in the same team; discovery also requires Google Drive and searches by document creation window. The document must contain a date and timestamped speaker-labelled transcript, not just Gemini notes. Meet supplies no original meeting title or participant emails; automatic Meet imports stay Only me and do not support attendance filters. For Wispr Flow, use a meeting ID from search: recorded meetings only, not dictation or scratchpad. Wispr attendee search uses calendar invitees; narrow a search that reaches 1,000 matches. audience, project_id and collection_id work as they do for calls (Only me and filed in Calls unless you say otherwise; a Collaborator must pass project_id; choose one of project_id or collection_id). name is ignored here because each call keeps its own title. The result lists every call as imported, duplicate, not_ready or failed, with where it was filed and who can see it, and never includes transcript text. If the app is not connected the call fails with an error that names the app and carries its Connect link: give the user that link, and retry once they have connected. When at least one call was imported the result carries automatic_import_link: offer it so the user can set up automatic import; it opens the rule editor with these choices filled in and nothing is saved until the user saves it. To find out whether an app is connected, or to get a Connect link before importing, use find_app.

Polling after "processing": get_context_item has no import_status. import_url: not found until the import finishes, then the item with its content. connected_webpage_url: the item exists at once with empty content (word_count 0) until the fetch lands; if the fetch fails a new page is removed (not found) and a tracked page keeps its saved copy. Poll for up to about 5 minutes; if the save is still unconfirmed, tell the user it couldn't be confirmed yet and do not re-add the URL yourself (a retry can create a duplicate). A failed slow import sends the user a "wasn't saved" notification.

Plan capacity: a processing import_url does not reserve a slot: if another add fills the plan's last slot, the import is refused when it finishes and adds nothing; a new web page holds its slot from the start. At the limit, a call that would create a context item (content, import_url or a new web page) returns an error stating the limit: deleting an item makes room. Re-adding a connected_webpage_url the team already tracks still refreshes it.

Extraction: both URL paths use AI main-content extraction: it isolates the primary page or article body and drops navigation and boilerplate. A connected_webpage_url fetch can fail when the page is unreachable or blocks automated requests.

Links: copy link_url character for character. Never retype, shorten, or rebuild a link or the IDs inside it.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "name": "<name>"
    },
    "name": "add_context"
  }
}

Input Schema

NameRequiredDescriptionDefault
nameYesShort, descriptive label for this reference item, shown in the library list and used when the AI cites it — make it specific enough to tell similar items apart ("Q3 Pricing Page" rather than "Pricing"). Required. When tracking a live web page, an empty name falls back to the page's own title.
as_callNoWhether to save `content` as a call transcript in Calls. Omit it and Marcora decides: text that looks like a transcript becomes a call. true: save as a call even if it does not look like one. false: save as an ordinary context item even if it looks like a transcript. Only valid with `content`.
contentNoThe item's body as markdown, pasted inline. Best for short or hand-authored material — it is stored as-is and embedded for retrieval immediately, so the item is usable the moment the call returns. Exactly one of content, import_url, or connected_webpage_url must be set; sending none, or more than one, is rejected (an empty string counts as not set).
audienceNoWho can see it. For a call: only_me (default; visible only to the person who added it) or team. For an ordinary context item: pass team when the user wants it saved for the team, even with a collection_id or project_id; in a private collection or project it is refused and nothing is saved, so tell the user and offer a shared collection, a team-visible project or the Reference Library, and never save privately without asking. only_me is rejected on an ordinary item.
call_dateNoCalls only. When the call happened, as YYYY-MM-DD or an ISO 8601 timestamp. Omit it to take the date from the transcript.
call_kindNoCalls only. The kind of call: customer (a customer call), external (a meeting with people outside the team), team_meeting, one_on_one, recorded (a recorded talk or other single-speaker recording). Omit it to let Marcora work it out from who spoke.
import_urlNoA publicly reachable URL to fetch ONCE and store as a static markdown snapshot; the snapshot can never be refreshed. Use it for one-off material — a competitor's post, an exported doc behind a temporary link. Exactly one of content, import_url, or connected_webpage_url may be set (none or two-plus is rejected), and the call waits up to about 25 seconds for the import: import_status "ready" on success, an error if the page can't be read (nothing is added), or "processing" only for a slow page. In that case the item does not exist until the import finishes: poll get_context_item with the returned id for up to about 5 minutes (not found, then the item with its content); if it is still not found, tell the user the save couldn't be confirmed yet and do not re-add the URL yourself. A failed slow import sends the user a "wasn't saved" notification.
project_idNoUUID of a project to attach this item to, from list_projects, so it shows up as that project's reference material. Omit it to leave the item unattached to any project. The project must belong to your team or the call fails, and users with the collaborator role can only add reference material inside a project, so for them this is effectively required.
import_fromNoBring in calls from a connected call-recording app instead of passing text. Use it instead of content, import_url and connected_webpage_url (it cannot be combined with them or with as_call, call_date, call_kind or call_company). Marcora fetches and cleans the transcripts itself; never pass transcript text. audience, project_id and collection_id apply as for calls.
call_companyNoCalls only. The other company on the call (null for none). Omit it to take the company from the transcript.
collection_idNoNumeric ID of the collection to file this item in, from list_context_collections or create_context_collection. Omit it (or pass null or 0) to leave the item loose in the reference library. The collection must belong to your team, and a private collection must be one you created — otherwise the call is rejected.
connected_webpage_urlNoA URL to track as a live page: the page is fetched and its URL is stored, so the item can be re-pulled later with update_context refresh_webpage. Use it for the customer's own pages and anything you want to keep current; re-adding a URL the team already tracks updates that item in place rather than creating a duplicate. Exactly one of content, import_url, or connected_webpage_url may be set (none or two-plus is rejected), and adding a tracked page requires an admin or editor role.

Output Schema

NameRequiredDescriptionDefault
idNoContext item ID
callNoCall details; present only on call items.
nameNoContext item name
contentNoThe stored reference content. Always null on add_context for import_url and connected_webpage_url items, ready or not: fetch the body with get_context_item. null for pasted content too.
messageNoCalls only. Where it went and who can see it; tell the user.
resultsNoPresent only on an import_from add: one entry per requested call, in order.
summaryNoPresent only on an import_from add: how many calls ended in each state.
audienceNoCalls only. Who can see it.
link_urlNoURL to view this context item in the Marcora web app.
project_idNoProject association (if assigned)
word_countNoWord count of content (0 while an import / webpage fetch is still processing)
import_fromNoPresent only on an import_from add: which app the calls came from.
content_typeNomanual (content/import_url), webpage (connected_webpage_url) or call_transcript (a call)
collection_idNoCollection this item belongs to (if assigned)
import_statusNoFor import_url and connected_webpage_url items: ready once loaded (the call waits up to about 25 seconds); processing only if the import is still running after that. get_context_item has no import_status: for import_url the item is not found until it finishes, for connected_webpage_url it exists at once with empty content until the fetch lands. null for pasted content.
saved_as_callNoTrue when saved as a call.
automatic_import_linkNoPresent only when at least one call was imported. Opens the automatic-import rule editor with this source, destination and audience filled in; nothing is saved until the user saves it. Offer it, exactly as returned.
brand_foundation_buildNoPresent only on a connected_webpage_url add that queued a build of the team's blank Brand Foundation sections from the website. Absent otherwise, so never imply a build is running without it.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / audience / description
      Previous value: -"Calls only. Who can see the call: only_me (default; visible only to the person who added it) or team. Rejected when the text is saved as an ordinary context item."New value: +"Who can see it. For a call: only_me (default; visible only to the person who added it) or team. For an ordinary context item: pass team when the user wants it saved for the team, even with a collection_id or project_id; in a private collection or project it is refused and nothing is saved, so tell the user and offer a shared collection, a team-visible project or the Reference Library, and never save privately without asking. only_me is rejected on an ordinary item."
    • changedInput schema / properties / import_from / properties / call_ids / description
      Previous value: -"The app's own call ids, 1 to 10, each once. Get them from its list or search tool."New value: +"1–10 unique IDs: Meet record ID or doc:{document_id}; Wispr meeting ID; otherwise call ID. Get them from the app's list or search tool."
    • changedInput schema / properties / import_from / properties / toolkit / description
      Previous value: -"fathom, gong or fireflies."New value: +"fathom, gong, fireflies, googlemeet or wispr_flow_mcp."
  2. Changed16 schema fields changed
    • addedInput schema / properties / as_call
      Added value: +{
      +  "description": "Whether to save `content` as a call transcript in Calls. Omit it and Marcora decides: text that looks like a transcript becomes a call. true: save as a call even if it does not look like one. false: save as an ordinary context item even if it looks like a transcript. Only valid with `content`.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / audience
      Added value: +{
      +  "description": "Calls only. Who can see the call: only_me (default; visible only to the person who added it) or team. Rejected when the text is saved as an ordinary context item.",
      +  "enum": [
      +    "only_me",
      +    "team"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / call_company
      Added value: +{
      +  "description": "Calls only. The other company on the call (null for none). Omit it to take the company from the transcript.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / call_date
      Added value: +{
      +  "description": "Calls only. When the call happened, as YYYY-MM-DD or an ISO 8601 timestamp. Omit it to take the date from the transcript.",
      +  "type": "string"
      +}
    • addedInput schema / properties / call_kind
      Added value: +{
      +  "description": "Calls only. The kind of call: customer (a customer call), external (a meeting with people outside the team), team_meeting, one_on_one, recorded (a recorded talk or other single-speaker recording). Omit it to let Marcora work it out from who spoke.",
      +  "enum": [
      +    "customer",
      +    "external",
      +    "team_meeting",
      +    "one_on_one",
      +    "recorded"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / import_from
      Added value: +{
      +  "description": "Bring in calls from a connected call-recording app instead of passing text. Use it instead of content, import_url and connected_webpage_url (it cannot be combined with them or with as_call, call_date, call_kind or call_company). Marcora fetches and cleans the transcripts itself; never pass transcript text. audience, project_id and collection_id apply as for calls.",
      +  "properties": {
      +    "call_ids": {
      +      "description": "The app's own call ids, 1 to 10, each once. Get them from its list or search tool.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "minItems": 1,
      +      "type": "array"
      +    },
      +    "toolkit": {
      +      "description": "fathom, gong or fireflies.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "toolkit",
      +    "call_ids"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / audience
      Added value: +{
      +  "description": "Calls only. Who can see it.",
      +  "enum": [
      +    "only_me",
      +    "team"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / automatic_import_link
      Added value: +{
      +  "description": "Present only when at least one call was imported. Opens the automatic-import rule editor with this source, destination and audience filled in; nothing is saved until the user saves it. Offer it, exactly as returned.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / call
      Added value: +{
      +  "description": "Call details; present only on call items.",
      +  "properties": {
      +    "audience": {
      +      "description": "only_me or team.",
      +      "enum": [
      +        "only_me",
      +        "team"
      +      ],
      +      "type": "string"
      +    },
      +    "company": {
      +      "description": "Other company, or null.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "date": {
      +      "description": "When it happened (ISO 8601), or null.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "kind": {
      +      "description": "Kind of call.",
      +      "enum": [
      +        "customer",
      +        "external",
      +        "team_meeting",
      +        "one_on_one",
      +        "recorded",
      +        null
      +      ],
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "people": {
      +      "description": "Who was on the call.",
      +      "items": {
      +        "properties": {
      +          "company": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "side": {
      +            "description": "internal = user’s team.",
      +            "enum": [
      +              "internal",
      +              "external",
      +              "unknown"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "side"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "summary_status": {
      +      "description": "Summary state; ready = a summary exists.",
      +      "enum": [
      +        "pending",
      +        "ready",
      +        "skipped",
      +        "failed",
      +        "waiting_credits",
      +        null
      +      ],
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "audience"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / properties / capacity
      Removed value: -{
      -  "description": "Present only when the team's plan limits context items. How much of the limit is used after this add. Absent when the plan has no limit.",
      -  "properties": {
      -    "limit": {
      -      "description": "The plan's maximum number of context items.",
      -      "type": "integer"
      -    },
      -    "remaining": {
      -      "description": "How many more context items the team can add (limit minus used, never below 0).",
      -      "type": "integer"
      -    },
      -    "used": {
      -      "description": "Context items the team has now, including this one.",
      -      "type": "integer"
      -    }
      -  },
      -  "required": [
      -    "used",
      -    "limit",
      -    "remaining"
      -  ],
      -  "type": "object"
      -}
    • changedOutput schema / properties / content_type / description
      Previous value: -"manual (content/import_url) or webpage (connected_webpage_url)"New value: +"manual (content/import_url), webpage (connected_webpage_url) or call_transcript (a call)"
    • addedOutput schema / properties / import_from
      Added value: +{
      +  "description": "Present only on an import_from add: which app the calls came from.",
      +  "properties": {
      +    "app_name": {
      +      "description": "The app's name to show the user.",
      +      "type": "string"
      +    },
      +    "toolkit": {
      +      "description": "The app's id, for example fathom.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "toolkit",
      +    "app_name"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / message
      Added value: +{
      +  "description": "Calls only. Where it went and who can see it; tell the user.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / results
      Added value: +{
      +  "description": "Present only on an import_from add: one entry per requested call, in order.",
      +  "items": {
      +    "properties": {
      +      "audience": {
      +        "description": "Who can see it (imported).",
      +        "enum": [
      +          "only_me",
      +          "team"
      +        ],
      +        "type": "string"
      +      },
      +      "call_id": {
      +        "description": "The app's id for the call.",
      +        "type": "string"
      +      },
      +      "context_item_id": {
      +        "description": "The saved context item (imported), or the existing one (duplicate).",
      +        "format": "uuid",
      +        "type": "string"
      +      },
      +      "filed_in": {
      +        "description": "Where it was filed, in words: Calls, a project or a collection (imported).",
      +        "type": "string"
      +      },
      +      "link_url": {
      +        "description": "Opens the context item in the Marcora web app (imported). Present exactly as returned.",
      +        "type": "string"
      +      },
      +      "message": {
      +        "description": "What happened, in words for the user.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "The context item's name (imported).",
      +        "type": "string"
      +      },
      +      "status": {
      +        "description": "imported = saved; duplicate = already in Marcora; not_ready = the app has no transcript yet, try later; failed = it could not be brought in.",
      +        "enum": [
      +          "imported",
      +          "duplicate",
      +          "not_ready",
      +          "failed"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "call_id",
      +      "status",
      +      "message"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / saved_as_call
      Added value: +{
      +  "description": "True when saved as a call.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / summary
      Added value: +{
      +  "description": "Present only on an import_from add: how many calls ended in each state.",
      +  "properties": {
      +    "duplicate": {
      +      "type": "integer"
      +    },
      +    "failed": {
      +      "type": "integer"
      +    },
      +    "imported": {
      +      "type": "integer"
      +    },
      +    "not_ready": {
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "imported",
      +    "duplicate",
      +    "not_ready",
      +    "failed"
      +  ],
      +  "type": "object"
      +}
  3. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (destructiveHint/openWorldHint true already signal a mutating, external-facing write) by disclosing role requirements, the ~25s wait, the static-snapshot vs live-tracking distinction, in-place overwrite of existing tracked pages, plan-capacity refusal and slot-reservation behavior, and the 'wasn't saved' notification. It also warns that a retry can create a duplicate, which is exactly the behavioral detail an agent needs before re-calling a non-idempotent tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Bold section headers and numbered path list make a very long description navigable, and the core routing rules are front-loaded. It is nonetheless dense and repeats the exactly-one-of constraint in the body and again per parameter, which a shorter cross-reference could handle.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter tool with four modes, nested import_from, and an output schema, it covers the remaining gaps an agent would hit: import_status vocabulary, polling cadence and duration, what get_context_item does and does not expose, and link handling. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the per-parameter descriptions already carry most routing rules (exactly-one-of, as_call-only-with-content, audience semantics), so much of the description's parameter prose duplicates structured data. The genuine addition is cross-parameter consequence: call-only fields are 'rejected rather than ignored' on ordinary items, and project_id/collection_id still permit audience:team only if the target is team-visible.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource ('Adds a new context item to the team's reference library') and immediately scopes what counts as context, distinguishing it from siblings like get_context_item, list_context_items and update_context which the text names as follow-ups rather than alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly enumerates four creation paths (content, import_url, connected_webpage_url, import_from) and states the selection criterion for each ('Best for short or hand-authored material', 'off for one-off imports', 'Use it for the customer's own pages and anything to keep current'). It also tells the agent when NOT to combine them, when to ask the user (audience on calls), and what to do after a refusal rather than falling back silently.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources