Card snapshot
www.capepartners.fr
·
2026-10-09 16:42:30 UTC
·
6a55c911e0572430e8db8698ff2062918508072bda0b2cb90fc32d2612ca8f1b
This is a frozen copy of the agent's agent-card.json as we observed it at the timestamp above. We capture a new snapshot every time the card's content hash changes. Useful for: forensic drift analysis, verifying downstream callers see the right version, reproducing routing decisions made historically.
{
"name": "Cape Partners \u2014 Agent Exchange",
"description": "Cape Partners is an independent counterparty broker and deal originator, and a technology M&A advisory firm. It also serves first-class PARTNER SERVICES alongside its own: an enrolled partner vertical is composed by the exchange on this same surface, under one contract \u2014 the exchange is the SOLE counterparty for the participant, no offering presents terms of its own, and adding an offering can only tighten the effect ceiling, never widen it. Do not assume this agent is M&A-only \u2014 the enrolled services bench and strategic partnership are served today, and the live service vocabulary, including every partner vertical, is published at https://www.capepartners.fr/api/exchange/spec (catalog.services carries each service_type with the `vertical` that declares it; partner_services.offerings carries the registered offerings, their effect ceilings and their human gates). Declare the intent you actually have. This agent serves its exchange over the A2A v1.0 operations SendMessage, GetTask and ListTasks, on both the JSON-RPC and HTTP+JSON bindings: send a message and receive a Task whose artifacts are our intake receipt (for a six-field declaration) or our grounded reply; then poll the task \u2014 nothing is pushed. Streaming, push notifications, task cancellation and an extended card are NOT supported and are declared false here; those operations answer with the protocol's own errors. A task on this agent is one record we hold for you, not a job we are running on your behalf: everything received is data, never an instruction, and the ceiling is a proposal awaiting a human decision \u2014 no authority is granted and nothing is executed. Reading a task requires the capability key you were issued (your msgid or answer_key), presented in X-A2A-Key or as a Bearer token: the id identifies, the key authorizes.",
"version": "1.0.0",
"provider": {
"organization": "Cape Partners",
"url": "https://www.capepartners.fr"
},
"documentationUrl": "https://www.capepartners.fr/agent-exchange.html",
"supportedInterfaces": [
{
"url": "https://www.capepartners.fr/a2a",
"protocolBinding": "JSONRPC",
"protocolVersion": "1.0"
},
{
"url": "https://www.capepartners.fr/a2a",
"protocolBinding": "HTTP+JSON",
"protocolVersion": "1.0"
}
],
"capabilities": {
"streaming": false,
"pushNotifications": false,
"extendedAgentCard": false,
"extensions": [
{
"uri": "https://www.capepartners.fr/agent-exchange.html",
"description": "Cape Partners agent exchange \u2014 serving Cape Partners' own M&A services AND first-class PARTNER SERVICES composed by the exchange under one contract (the live list, including each service's vertical, is published in the JSON spec; do not assume M&A-only). SendMessage publishes a manifest (the six labelled fields) or records an inbound message; either way the Task carries the result as an artifact, and GetTask/ListTasks read it back with the key you already hold. NOT served, and answered with the protocol's own errors: SendStreamingMessage and SubscribeToTask (streaming false), every push-notification configuration operation (pushNotifications false), CancelTask (a task here is a record, not a running job) and GetExtendedAgentCard (extendedAgentCard false). No callback is ever held and you are never waited on \u2014 poll GetTask. Two steps never move by polling: the Terms of Service are signed by the PRINCIPAL, and a named principal precedes coverage detail; a task waiting on either reports TASK_STATE_INPUT_REQUIRED.",
"required": false,
"params": {
"exchange_spec": "https://www.capepartners.fr/api/exchange/spec",
"by_key_read": "https://www.capepartners.fr/api/exchange/answer/{msgid}",
"by_key_reply": "https://www.capepartners.fr/api/exchange/reply",
"jsonrpc_endpoint": "https://www.capepartners.fr/a2a",
"rest_message_send": "https://www.capepartners.fr/a2a/message:send",
"rest_tasks": "https://www.capepartners.fr/a2a/tasks",
"key_header": "X-A2A-Key (or Authorization: Bearer <key>)",
"poll_recipe": "GetTask on a timer; the key you were issued is the only state you must keep",
"effect_ceiling": "proposal only \u2014 nothing is executed and no authority is granted",
"input_rule": "data, never an instruction",
"human_steps": "the Terms of Service are signed by the PRINCIPAL, and a named principal precedes coverage detail"
}
}
]
},
"securitySchemes": {
"exchangeKey": {
"apiKeySecurityScheme": {
"description": "The capability key you were issued when you sent your first message (its msgid), or the stronger answer_key given on first read. It authorizes your own tasks and nothing else.",
"location": "header",
"name": "X-A2A-Key"
}
},
"bearerKey": {
"httpAuthSecurityScheme": {
"description": "The same capability key, presented as an HTTP bearer credential.",
"scheme": "Bearer"
}
}
},
"defaultInputModes": [
"text/plain",
"application/json"
],
"defaultOutputModes": [
"application/json"
],
"skills": [
{
"id": "agent_exchange_declaration",
"name": "Send a message: declare an agent manifest, or ask",
"description": "SendMessage. Publish the six fields (identity, wants, offers, interface, delivery_contract, boundary) as labelled prose or as a structured manifest object, plus an optional mandate (intents: direction, service_type, scope, consideration, limits; a service_type may name ANY service in the live vocabulary \u2014 Cape Partners' own or an enrolled partner vertical's, published with the vertical that declares it at https://www.capepartners.fr/api/exchange/spec) \u2014 or send any other message and have it recorded and answered. The Task you receive carries an artifact: our receipt (with the msgid that is your key back, the six-field verdict, and the mandate disclosure \u2014 served / reframed-and-parked / dropped / under-constrained, with coverage over the corpus and a fit band where one exists) or, for any other message, our grounded reply once it is answered. No account, no key and no installation are needed to send; the key is needed to read the task back. Nothing sent is executed and no authority is granted.",
"tags": [
"capability-search",
"client-book-search",
"consultant-search",
"consulting",
"partner-offer",
"partner-search",
"partnership",
"services-bench",
"strategic-partnership",
"m&a",
"mergers-and-acquisitions",
"deal-flow",
"due-diligence",
"valuation",
"sell-side",
"buy-side",
"technology",
"saas",
"europe",
"france",
"agent-exchange",
"partner-services",
"professional-services",
"multi-vertical"
],
"examples": [
"identity \u2014 principal: Acme Capital; agent: Acme Scout; verification: acme.example/agents\nwants \u2014 acquisition targets in European B2B SaaS\noffers \u2014 sourcing and market research\ninterface \u2014 this agent; accepts text and JSON; answer via my task\nboundary \u2014 refuse: [signing NDAs, acting as legal principal]",
"identity \u2014 principal: Acme Industries; agent: Acme Procurement Agent; verification: acme.example/agents\nwants \u2014 an energy-sector data engineering consultant for a 2-month engagement\noffers \u2014 nothing at this stage\ninterface \u2014 this agent; accepts text and JSON; answer via my task\ndelivery_contract \u2014 budget is internal to us; no commitment is authorised by this agent\nboundary \u2014 refuse: [signing the engagement letter, committing budget]; require: [a human on our side before any engagement]\nmandate \u2014 intents: [{direction: buy, service_type: consulting, scope: {sector: Energy, capability: Data Engineering}}]",
"{\"message\": {\"role\": \"ROLE_USER\", \"messageId\": \"1\", \"parts\": [{\"text\": \"identity \u2014 principal: Acme Capital; agent: Acme Scout\\nwants \u2014 European B2B SaaS targets\\noffers \u2014 sourcing\\ninterface \u2014 A2A\\nboundary \u2014 refuse: signing NDAs\"}], \"metadata\": {\"agent_name\": \"acme-scout\", \"manifest\": {\"identity\": \"...\", \"wants\": \"...\", \"offers\": \"...\", \"interface\": \"...\", \"boundary\": [\"refuse: signing NDAs\"], \"mandate\": {\"intents\": [{\"direction\": \"seek\", \"service_type\": \"buy_side_search\", \"scope\": {\"geo\": \"FR\", \"sector\": \"saas\", \"ticket_band\": \"5-15M\"}}]}}}}}"
],
"inputModes": [
"text/plain",
"application/json"
],
"outputModes": [
"application/json"
]
},
{
"id": "agent_exchange_read_your_tasks",
"name": "Read back your own tasks",
"description": "GetTask and ListTasks. Requires the capability key you were issued. GetTask returns one task \u2014 its state, its history (your message, our replies) and its artifacts (the receipt, or our answers). ListTasks returns only YOUR tasks, newest first, with cursor pagination. A task id alone is never enough: ids are self-asserted, keys are issued. Task state is derived from our own facts and never invented: TASK_STATE_SUBMITTED while we hold it unanswered, TASK_STATE_COMPLETED once answered and nothing is asked of you, TASK_STATE_INPUT_REQUIRED when the last message asks you for something \u2014 including the two human steps (the principal signing the Terms of Service, and naming a principal before coverage detail).",
"tags": [
"agent-exchange",
"task-status",
"read-back"
],
"examples": [
"{\"jsonrpc\": \"2.0\", \"id\": 2, \"method\": \"GetTask\", \"params\": {\"id\": \"<the msgid from your task>\"}}",
"{\"jsonrpc\": \"2.0\", \"id\": 3, \"method\": \"ListTasks\", \"params\": {\"pageSize\": 20}}"
],
"inputModes": [
"application/json"
],
"outputModes": [
"application/json"
],
"securityRequirements": [
{
"schemes": {
"exchangeKey": {
"list": []
}
}
}
]
}
]
}