Log in

Docs › Developers

Developers

Build on the memory.

MeetCrew has two developer surfaces, and they point in opposite directions. Your backend agent answers when MeetCrew calls it during a meeting. Your own agent reads the meeting memory back from MeetCrew — over an MCP server or a REST API, whichever suits how it is built — and acts on it. Keep the direction of call straight and the rest is simple.

Agent backend contract

MeetCrew calls you. When the teammate is addressed in a meeting, MeetCrew POSTs to your endpoint and speaks what you return. Front Copilot Studio, Microsoft Foundry Agent Service, an OpenAI-compatible endpoint, or your own webhook.

Memory API — MCP or REST

You call MeetCrew. Your own agent connects over MCP or plain REST and reads structured cross-meeting memory — decisions, open questions, action items, statements, topics — then acts on it in your systems. Same records, same token, either way.

Auth is Microsoft Entra throughout. Backend credentials are stored as Azure Key Vault secret references, never raw secrets. Every call is scoped to one tenant, enforced server-side. v1  The MCP surface reads memory and acts on the workflow records — action items, decisions, and open questions; it can’t delete, or alter transcripts, statements, provenance, or the audit log. Streaming responses and per-utterance retries are planned.

Memory API — MCP and REST

Your agent reads — and acts on — the memory.

Two endpoints, one contract. https://mcp.meetcrew.ai/v1 speaks MCP over Streamable HTTP; https://api.meetcrew.ai/v1 is the same memory over ordinary REST. They return the same records with the same field names, so the choice is about how your agent is built, not about what it can see. Authenticate either with a Microsoft Entra bearer token for a service principal you grant in the admin console — the same token works on both. The tenant is derived from the token — a client can’t reach another tenant’s memory even by guessing IDs. Reads and actions are scoped to a deployment (one named teammate); cross-deployment access requires an admin opt-in grant. A grant also carries an access level: read serves every read, and the four actions need read and write, which your admin selects when issuing the grant.

Resources

meetcrew://deployments

List the named teammates the caller may read.

meetcrew://meetings/{meeting_id}

A single meeting’s canonical record — participants and a memory rollup.

Tools

listDecisions

Decisions recorded across meetings.

deployment_id · since? · until? · meeting_id? · limit?

listOpenQuestions

Questions raised in meetings, whether or not they have been resolved, with status open | resolved.

deployment_id · since? · until? · meeting_id? · limit?

listActionItems

Action items and their assignees, with status open | done.

deployment_id · status? · assignee_entra_id? · since? · until? · meeting_id? · limit?

listStatements

Attributed statements made in a meeting. High volume — scope by date or meeting.

deployment_id · since? · until? · meeting_id? · limit?

listTopics

Topics discussed, with the meetings that touched each one.

deployment_id · limit?

searchMemory

Semantic + keyword search across every record type.

deployment_id · query · types? · since? · until? · limit?

getMeeting

One meeting with its participants and a per-type memory count.

meeting_id · deployment_id

Every record carries attribution — a Microsoft Entra platform identity, or anonymous — plus created_at and deployment_id. No voiceprints are ever used for attribution.

Actions v1

createActionItem

Create an action item from what the meeting decided.

deployment_id · text · assignee_entra_id? · due_date? · meeting_id?

updateActionItem

Change status open | done, reassign, or set a due date.

deployment_id · action_item_id · status? · assignee_entra_id? · due_date? · clear_due_date?

resolveOpenQuestion

Mark an open question resolved (or reopen it), with an optional note.

deployment_id · open_question_id · status · note? · clear_note?

updateDecision

Move a decision to confirmed or superseded, with an optional note.

deployment_id · decision_id · status · note? · clear_note?

Actions are confined to workflow state on action items, decisions, and open questions. There is no delete, and no action can alter a transcript, a statement, provenance, or the audit log. Every action is authenticated, tenant- and deployment-scoped, and logged.

REST — the same memory, ordinary HTTP v1

Base https://api.meetcrew.ai/v1. Every route is deployment-scoped, and the tenant is never in the path — it comes from the token. Responses carry the same records as the MCP tools above, field for field.

GET /deployments

The named teammates this principal may reach, with the access level of each grant.

GET /deployments/{deployment_id}/decisions

Decisions recorded across meetings.

since? · until? · meeting_id? · limit?

GET /deployments/{deployment_id}/open-questions

Unresolved questions raised in meetings.

since? · until? · meeting_id? · limit?

GET /deployments/{deployment_id}/action-items

Action items and their assignees.

status? · assignee_entra_id? · since? · until? · meeting_id? · limit?

GET /deployments/{deployment_id}/statements

Attributed statements made in a meeting.

since? · until? · meeting_id? · limit?

GET /deployments/{deployment_id}/topics

Topics discussed — accounts, projects and themes.

limit?

GET /deployments/{deployment_id}/search

Semantic and keyword search across record types, in relevance order.

q · types? · since? · until? · limit?

GET /deployments/{deployment_id}/meetings/{meeting_id}

One meeting with its participants and per-type memory counts.

POST /deployments/{deployment_id}/action-items

Create an action item. Answers 201 with a Location.

text · assignee_entra_id? · due_date? · meeting_id?

PATCH /deployments/{deployment_id}/action-items/{action_item_id}

Change status open | done, reassign, or set a due date.

status? · assignee_entra_id? · due_date? · clear_due_date?

PATCH /deployments/{deployment_id}/open-questions/{open_question_id}

Mark an open question resolved, or reopen it.

status · note? · clear_note?

PATCH /deployments/{deployment_id}/decisions/{decision_id}

Move a decision to confirmed or superseded.

status · note? · clear_note?

PATCH rather than PUT, because none of these replaces a record: every field is optional and only workflow state can change. A parameter or body field we don’t recognise is refused, not ignored — a dropped filter would return more than you asked for, and a dropped field would mean a change you believe you made didn’t happen.

Errors, limits and versioning

Failures are RFC 9457 problem documents. Match on the status code, never on the message text — wording can change without notice.

401

The token carries no usable oid / tid. Request it with the client-credentials flow for a service principal.

403

No active grant for that deployment, or the grant is read-only and the call would change memory. A deployment that doesn’t exist answers identically, on purpose — the status code is not a way to discover what a tenant has.

404

No such record inside the deployment you’re authorized for.

429

Over the rate limit: 600 requests per minute per service principal, across both endpoints. Honour Retry-After.

502

A change was not applied — MeetCrew’s own upstream refused the call. Retrying will not help; tell us.

503

On a read, memory was unreachable. This is not an empty result — retry rather than concluding the teammate remembers nothing. On a write, the outcome is unknown and may have been applied: read the record back before repeating it.

Every call on both endpoints is logged and attributable to the Entra identity that made it — reads and actions are retained differently, which matters when you are answering a question about something months old. Trust & Security has the retention periods.

Within v1 we add, we don’t remove: new fields, parameters, endpoints and enum values can appear at any time, so ignore what you don’t recognise rather than failing on it. Nothing is renamed or removed, and no status code changes meaning. A breaking change means a new prefix served alongside this one, with 90 days’ notice to the administrator who issued your grant before deprecation and at least 180 days more before v1 stops answering — announced by email and carried on every response as Deprecation and Sunset headers.

Example — search memory

// MCP tools/call
{
  "name": "searchMemory",
  "arguments": {
    "deployment_id": "dep_jim",
    "query": "pricing decision",
    "types": ["decision", "open_question"],
    "since": "2026-06-01",
    "limit": 2
  }
}
{
  "results": [
    {
      "id": "dec_5521", "type": "decision", "score": 0.94,
      "text": "Hold list pricing flat through Q3; revisit at QBR.",
      "decided_at": "2026-06-30T16:20:00Z", "meeting_id": "mtg_4790",
      "attribution": { "kind": "platform_identity", "display_name": "Priya Shah" },
      "deployment_id": "dep_jim"
    },
    {
      "id": "oq_0912", "type": "open_question", "score": 0.71, "status": "open",
      "text": "Do enterprise renewals get the same flat-pricing treatment?",
      "raised_at": "2026-06-30T16:24:00Z", "meeting_id": "mtg_4790",
      "attribution": { "kind": "anonymous" }, "deployment_id": "dep_jim"
    }
  ],
  "next_cursor": null
}

Example — close an action item

// MCP tools/call
{
  "name": "updateActionItem",
  "arguments": {
    "deployment_id": "dep_jim",
    "action_item_id": "ai_3315",
    "status": "done"
  }
}
{
  "id": "ai_3315", "type": "action_item", "status": "done",
  "text": "Add pricing revisit to QBR agenda",
  "assignee": { "kind": "platform_identity", "display_name": "Dana Ruiz" },
  "updated_at": "2026-07-07T15:40:00Z",
  "updated_by": { "kind": "service_principal", "display_name": "Renewals Agent" },
  "deployment_id": "dep_jim"
}

Example — the same two calls over REST

Same token, same records. Only the envelope differs.

# search
curl -H "Authorization: Bearer $TOKEN" \
  "https://api.meetcrew.ai/v1/deployments/dep_jim/search?q=pricing+decision&types=decision,open_question&since=2026-06-01&limit=2"

# close an action item
curl -X PATCH -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" -d '{"status":"done"}' \
  "https://api.meetcrew.ai/v1/deployments/dep_jim/action-items/ai_3315"
// the search response — identical to the MCP result above
{
  "results": [
    {
      "id": "dec_5521", "type": "decision", "score": 0.94,
      "text": "Hold list pricing flat through Q3; revisit at QBR.",
      "decided_at": "2026-06-30T16:20:00Z", "meeting_id": "mtg_4790",
      "attribution": { "kind": "platform_identity", "display_name": "Priya Shah" },
      "deployment_id": "dep_jim"
    }
  ],
  "was_capped": false,
  "next_cursor": null
}
Agent backend contract

MeetCrew calls your agent.

Register your endpoint per deployment. When the teammate is addressed, MeetCrew POSTs a neutral request — a system prompt, the conversation so far, the tools MeetCrew exposes, and correlation metadata — and speaks the content you return. Your budget for the round trip arrives on metadata.timeout_ms: 15s by default, tunable 1–30s per deployment. Aim well under it — the teammate is speaking in real time. If the budget expires it speaks a brief fallback, so the meeting never hangs.

Request — MeetCrew → your backend

{
  "system": "You are Jim, a renewals-focused colleague on this call...",
  "messages": [
    { "role": "user",
      "content": "Jim, did we ever close the pricing decision from last week?" }
  ],
  "tools": [
    { "name": "janus_memory_query_semantic",
      "description": "Search this teammate's cross-meeting memory.",
      "parameters_schema": {
        "type": "object",
        "properties": { "query": { "type": "string" } },
        "required": ["query"]
      } }
  ],
  "metadata": {
    "deployment_id": "8f14e45f-ceea-467a-9575-8b3d4c2f1a90",
    "invocation_id": "9f2c1b7e-3a44-4d18-b0c6-27e5a1d99f31",
    "meeting_id": "4823ab90-77c1-4e2f-9d5a-6b0e3f8c1d24",
    "timeout_ms": 15000
  }
}

Response — your backend → MeetCrew

{
  "content": "Yes — last week you decided to hold list pricing flat through Q3 and revisit at the QBR. Priya owns the follow-up.",
  "tool_calls": null,
  "finish_reason": "stop",
  "metadata": { "latency_ms": 820, "tokens_used": 143 }
}

Auth: an HMAC-SHA256 signature over the raw request body, keyed by a per-deployment shared secret and sent as X-Janus-Signature: sha256=<lowercase-hex>. The secret is held as a Key Vault secret reference, never a raw secret, and the endpoint must be https. content is what the teammate speaks. To use a tool MeetCrew declared, return tool_calls with finish_reason: "tool_calls" — MeetCrew runs the tool and calls you back with the result so you can compose the final reply. Response bodies are capped at 1 MB by default.

Quickstart

First 15 minutes.

Zero to a teammate answering in a test meeting, and your agent reading that meeting’s memory over MCP.

  1. Sign in to the admin console with an Entra admin account. Confirm your tenant region is US or Canada.
  2. Create a deployment — name the teammate (say, “Jim”), pick platform, voice, and avatar. This provisions memory scoped to dep_jim.
  3. Register your agent backend endpoint and its credential — paste a Key Vault secret reference, never the raw secret.
  4. Stub the backend: return { "content": "Hi, I'm Jim." } and confirm it answers inside the budget on metadata.timeout_ms.
  5. Admit the teammate into a test meeting. Confirm the disclosure banner shows Jim as AI.
  6. Say “Jim, are you there?” and hear the stubbed reply. The backend contract now works end to end.
  7. Point the endpoint at your real Copilot Studio, Microsoft Foundry, or custom agent. Use system + messages to compose the reply.
  8. Grant your agent MCP access — create a service-principal grant in the console. Choose read and write if your agent will use the actions; read-only is the default, and the four actions are refused under it.
  9. Connect your MCP client to https://mcp.meetcrew.ai/v1 with an Entra bearer token. List meetcrew://deployments and confirm dep_jim appears.
  10. Call getMeeting, then listDecisions scoped to dep_jim. Your agent is now reading cross-meeting memory. Ship from here.

Ready to wire it up?

Start a pilot and we’ll set up a deployment, connect your backend, and issue an MCP grant with you.