Menu

DevelopersMCP

MCP tools reference

Every tool the AutoRFP.ai MCP server offers, with its required scope, whether it reads or writes, its arguments and an example tools/call request.

These are the tools an MCP client can call. tools/list only returns the tools your token’s scopes allow. Tools marked Write change data and need a write scope.

To call a tool, send a tools/call request as shown in Connect an AI assistant.

list_tags#

List tags

ReadRequired scopetags:read

Returns all categories and the tags within each, configured for the organisation. Categories are top-level groupings (e.g. 'Topic', 'Region'); tags are the values within them (e.g. 'Security', 'EMEA'). Use this to discover the tag vocabulary before filtering list_projects, list_requirements, or search_content by tag.

Request

curl -X POST "https://api.autorfp.ai/mcp" \
  -H "Authorization: Bearer $AUTORFP_ACCESS_TOKEN" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_tags",
    "arguments": {}
  }
}'

list_projects#

List projects

ReadRequired scopeprojects:read

Returns RFP projects accessible to the authenticated user, with the categories and tags applied to each project's requirements. Filter by status, due date range, or tag IDs. Each result includes the project id, name, status, issuer, due date, description, and category-grouped tags, so you can identify the right project by topic without calling get_project. Draft-status projects are excluded by default; pass status: ['draft'] (alone or with other statuses) to include them.

Arguments

  • statusarray of strings

    Filter to projects whose status matches any of the given values. When omitted, draft-status projects are excluded by default; pass ['draft'] (alone or with other statuses) to include them.

    One of:draftintakeinProgresscompletedshortlistedoverduelostwonstopped

    min 1 items

  • tagIdsarray of strings

    Filter to projects whose requirements include any of the given tag IDs. Use list_tags to discover the available tag vocabulary. Empty arrays are rejected, omit the argument if you do not want to filter.

    1 to 50 items

  • dueBeforeinteger | string (date-time)

    Filter to projects whose due date is on or before this date (inclusive). Accepts ISO 8601 string (e.g. "2025-04-01T00:00:00Z") or epoch milliseconds.

  • dueAfterinteger | string (date-time)

    Filter to projects whose due date is on or after this date (inclusive). Accepts ISO 8601 string or epoch milliseconds.

  • pageinteger

    1-indexed page number; the response carries a `pagination.hasMore` flag and the total count.

    min 1

Request

curl -X POST "https://api.autorfp.ai/mcp" \
  -H "Authorization: Bearer $AUTORFP_ACCESS_TOKEN" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_projects",
    "arguments": {}
  }
}'

get_project#

Get project

ReadRequired scopeprojects:read

Returns full details for a project: header (name, issuer, status, due date, description), requirement counts broken down by progress status, and the categorised tags applied to this project's requirements. Use list_requirements next to retrieve the actual question-and-answer content.

Arguments

  • projectIdstringrequired

    The id of the project to fetch, typically obtained from list_projects.

    non-empty

Request

curl -X POST "https://api.autorfp.ai/mcp" \
  -H "Authorization: Bearer $AUTORFP_ACCESS_TOKEN" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_project",
    "arguments": {
      "projectId": "8f14e45f"
    }
  }
}'

list_requirements#

List requirements

ReadRequired scopeprojects:read

Returns paginated requirements (the questions and their current/approved answers) for a project. Filter by status, prefer 'approved' for reliable answers, by tag IDs, by date range (answeredAfter/answeredBefore accept ISO 8601 strings like '2025-01-01T00:00:00Z' or epoch ms; useful for scoping to a quarter or year), by lastUpdatedBy (user IDs of the last person to update the response, closest signal for authorship in single-owner workflows, less reliable in collaborative ones), or by hasAnswer to drop blank/whitespace-only answers. Each result includes question, answer, section context, status, tags applied, answeredAt (ISO 8601 string), and lastUpdatedBy user. Pagination returns 25 requirements per page; use the page argument and check pagination.hasMore to walk further. Each result's `version` is required by update_requirement_answer.

Arguments

  • projectIdstringrequired

    The id of the project, typically obtained from list_projects.

    non-empty

  • statusarray of strings

    Filter to requirements whose progress status matches any of the given values. Prefer "approved" for reliable answers.

    One of:draftedassignedsubmittedForReviewapproved

    min 1 items

  • tagIdsarray of strings

    Filter to requirements tagged with any of the given tag IDs. Empty arrays are rejected, omit if not filtering.

    1 to 50 items

  • answeredAfterinteger | string (date-time)

    Filter to requirements answered on or after this date. Accepts ISO 8601 string (e.g. "2025-01-01T00:00:00Z") or epoch milliseconds. Use to scope to a date range (e.g. quarter, year).

  • answeredBeforeinteger | string (date-time)

    Filter to requirements answered on or before this date. Accepts ISO 8601 string or epoch milliseconds.

  • lastUpdatedByarray of strings

    Filter to requirements where the last person to update the response is one of these user IDs. NOTE: this is the *last updater*, not necessarily the original responder, in collaborative workflows it may be a reviewer who tweaked the wording. For drafting orgs where one user owns each response it's an accurate signal of authorship. Empty arrays are rejected, omit if not filtering.

    1 to 50 items

  • hasAnswerboolean

    When true, return only requirements with a non-empty answer (whitespace-only is treated as empty). When false, return only blank/whitespace-only answers. Omit to return both.

  • pageinteger

    1-indexed page number; the response carries a `pagination.hasMore` flag and the total count.

    min 1

Request

curl -X POST "https://api.autorfp.ai/mcp" \
  -H "Authorization: Bearer $AUTORFP_ACCESS_TOKEN" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_requirements",
    "arguments": {
      "projectId": "8f14e45f"
    }
  }
}'

search_content#

Search content

ReadRequired scopecontent:read

Semantic search over the organisation's approved content library, past RFP answers indexed for retrieval. Returns ranked text excerpts (with file name and section context) that the agent can quote or paraphrase. Optionally filter by tag IDs to narrow results to a category. Use list_tags to discover the tag vocabulary first.

Arguments

  • querystringrequired

    Natural-language search query, semantic search over the approved content library and imported documents.

    non-empty

  • tagIdsarray of strings

    Optional tag IDs to filter results to. Only content tagged with at least one of these IDs is returned. Use list_tags to discover the vocabulary first; unknown tag IDs yield zero results. If you do not want to filter by tag, omit this argument, passing an empty array is rejected.

    1 to 50 items

Request

curl -X POST "https://api.autorfp.ai/mcp" \
  -H "Authorization: Bearer $AUTORFP_ACCESS_TOKEN" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "search_content",
    "arguments": {
      "query": "data retention policy"
    }
  }
}'

list_content#

List content

ReadRequired scopecontent:read

Enumerates the organisation's content library, Q&A pairs, snippets, and imported documentation. Unlike search_content (which is semantic and ranked), this tool lists by metadata: filter by tagIds, fileType (QA/documentation/snippet/entireFile), createdAfter/createdBefore/updatedAfter/updatedBefore (accept ISO 8601 strings like '2025-01-01T00:00:00Z' or epoch ms), or hasAnswer (Q&A only, drops blank/whitespace answers). Returns 25 items per page sorted by updatedAt desc, then createdAt desc, then id asc, bulk-imported libraries with identical timestamps stay deterministic. pagination.total reflects the *filtered* count, not the unfiltered library size. Each row carries fileType, question/answer (Q&A pairs only, null on documentation), section (documentation/entireFile only, null on Q&A), tagIds, createdAt and updatedAt (both ISO 8601), usageCount (all-paths usage counter, may exceed list_content_usage's row count when snippet embeds/bulk-imports are involved), referenceUrl, and optional sourceUrl (key omitted for native content; check `'sourceUrl' in row`). Useful for surveying coverage, finding recent additions, or auditing tag application.

Arguments

  • tagIdsarray of strings

    Filter to content tagged with at least one of these IDs. Use list_tags to discover the vocabulary. If you do not want to filter by tag, omit this argument, empty arrays are rejected.

    1 to 50 items

  • fileTypearray of strings

    Filter by content type. 'QA' = vetted question/answer pairs, 'snippet' = reusable answer snippets, 'documentation' = imported reference docs, 'entireFile' = whole-file imports.

    One of:QAdocumentationsnippetentireFile

    min 1 items

  • createdAfterinteger | string (date-time)

    Filter to content created on or after this date. Accepts ISO 8601 string (e.g. "2025-01-01T00:00:00Z") or epoch milliseconds.

  • createdBeforeinteger | string (date-time)

    Filter to content created on or before this date. Accepts ISO 8601 string or epoch milliseconds.

  • updatedAfterinteger | string (date-time)

    Filter to content updated on or after this date. Accepts ISO 8601 string or epoch milliseconds.

  • updatedBeforeinteger | string (date-time)

    Filter to content updated on or before this date. Accepts ISO 8601 string or epoch milliseconds.

More parameters 4
  • lastUsedAfterinteger | string (date-time)

    Filter to content last used in a project answer on or after this date. Accepts ISO 8601 string or epoch milliseconds. Items never used in a project answer are excluded.

  • lastUsedBeforeinteger | string (date-time)

    Filter to content last used in a project answer on or before this date. Accepts ISO 8601 string or epoch milliseconds. Items never used in a project answer are excluded.

  • hasAnswerboolean

    When true, return only Q&A-shaped content with a non-empty answer. When false, return only Q&A items missing or with whitespace-only answers. No effect on documentation-shaped content (which doesn't have an answer field). Omit to return both.

  • pageinteger

    1-indexed page number; the response carries a `pagination.hasMore` flag and the total count.

    min 1

Request

curl -X POST "https://api.autorfp.ai/mcp" \
  -H "Authorization: Bearer $AUTORFP_ACCESS_TOKEN" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_content",
    "arguments": {}
  }
}'

list_content_usage#

List content usage

ReadRequired scopecontent:read

Reverse lookup: given a content library item's id, returns the requirements (in projects) that have reused it. Two usage signals are surfaced: 'auto-generated' (the response engine retrieved this content as a primary or secondary source for an answer, similarityScore included when this was the primary source) and 'user-added' (a user explicitly inserted this content from the library via the editor). Filter by usageType, usedAfter/usedBefore (accept ISO 8601 strings like '2025-01-01T00:00:00Z' or epoch ms; usage = response last-update). Each row carries projectId, projectName, projectStatus (won/lost/inProgress visible here for outcome correlation), projectDueAt (ISO 8601), responseId, questionNumber, question, usageType, usedAt (ISO 8601), and similarityScore (only on auto-generated rows where this content was the primary source). Returns 25 rows per page sorted by usedAt desc. SCOPE NOTE: results are filtered against per-project membership, confidential projects you aren't a member of, and soft-deleted projects, are not returned even if they contain a usage. May still return fewer rows than list_content's usageCount because snippet-embed usages (snippetEmbeds[].snippetId) aren't indexed by this query. Unknown contentIds return empty results without error, validate IDs via search_content or list_content first if uncertain.

Arguments

  • contentIdstringrequired

    The content's id (matches the `id` field returned by search_content / list_content rows, this is the embeddingId).

    non-empty

  • usageTypearray of strings

    Filter to specific usage types. 'auto-generated' = response engine retrieved this content as the answer source. 'user-added' = a user explicitly inserted it from the library.

    One of:auto-generateduser-added

    min 1 items

  • usedAfterinteger | string (date-time)

    Filter to usages where the response was last updated on or after this date. Accepts ISO 8601 string (e.g. "2025-01-01T00:00:00Z") or epoch milliseconds.

  • usedBeforeinteger | string (date-time)

    Filter to usages where the response was last updated on or before this date. Accepts ISO 8601 string or epoch milliseconds.

  • pageinteger

    1-indexed page number; the response carries a `pagination.hasMore` flag and the total count.

    min 1

Request

curl -X POST "https://api.autorfp.ai/mcp" \
  -H "Authorization: Bearer $AUTORFP_ACCESS_TOKEN" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_content_usage",
    "arguments": {
      "contentId": "8f14e45f"
    }
  }
}'

get_content#

Get content

ReadRequired scopecontent:read

Returns one content library item in full: its question or section title, the complete answer/section body as HTML, a `version` token, and `editAction` (what update_content would do for this user right now: "update" goes live, "suggest" goes to review, "none" means it cannot be edited here). Use it after search_content or list_content to read an item before editing it, and pass its `version` to update_content.

Arguments

  • contentIdstringrequired

    The id of the content item, from search_content or list_content.

    non-empty

Request

curl -X POST "https://api.autorfp.ai/mcp" \
  -H "Authorization: Bearer $AUTORFP_ACCESS_TOKEN" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_content",
    "arguments": {
      "contentId": "8f14e45f"
    }
  }
}'

update_content#

Update content

WriteRequired scopecontent:edit

Replaces the whole answer (Q&A pair) or section body (documentation) of one content library item. The question or section title is not changed. Call get_content first and pass its `version`; send the complete new body as HTML, in the same form get_content returns it, keeping any formatting you were not asked to change. Read `status` in the result: - applied: the new body is live. `version` is its new version. - suggested: the user can't edit this item directly, so the change went to the item's review flow instead of going live. Tell the user it is awaiting review. - stale: someone changed the item since you read it. Call get_content again and re-apply the user's requested change to the new body. Never retry the same body with the new version. - refused: read_only (locked, already has a pending change, or the user lacks permission), unsupported_item (snippets, entire-file imports, items embedding snippets, and items with inline comments or externally hosted images cannot be edited here), unsafe_body (the body contains markup the library cannot store), empty (the body has no text; to clear an item, do it in AutoRFP), not_html (the body is plain text or Markdown; send it as HTML), archived (the item is archived; restore it in AutoRFP first). An item that does not exist or that the user cannot see returns an error instead.

Arguments

  • contentIdstringrequired

    The id of the content item, from search_content or list_content.

    non-empty

  • versionstringrequired

    The `version` returned by get_content for this item.

    non-empty

  • bodystringrequired

    The complete new answer or section body, as HTML, at most 100000 characters.

    1 to 100000 characters

Request

curl -X POST "https://api.autorfp.ai/mcp" \
  -H "Authorization: Bearer $AUTORFP_ACCESS_TOKEN" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "update_content",
    "arguments": {
      "contentId": "8f14e45f",
      "version": "1",
      "body": "<p>Updated text.</p>"
    }
  }
}'

update_requirement_answer#

Update requirement answer

WriteRequired scoperequirements:write

Replaces the whole answer of one requirement in a project. The question is not changed, and neither is the requirement's status. Pass the `version` from list_requirements for this requirement, and send the complete new answer as HTML, keeping anything you were not asked to change. Read `status` in the result: - applied: the new answer is live. `version` is its new version. - stale: someone changed the answer since you read it. Call list_requirements again and re-apply the user's requested change to the new answer. Never retry the same answer with the new version. - refused: empty (the answer has no text; to clear an answer, do it in AutoRFP), locked (approved, or locked by the project's review settings), ai_disabled (AI is turned off for this requirement), held (the project is still importing), multi_part (the requirement has several answer fields; edit it in AutoRFP instead), snippet_backed (the answer is built from library snippets; edit it in AutoRFP so the snippets stay linked), being_edited (someone else has this requirement open in AutoRFP; tell the user and try again later), in_review (the answer is in review; ask a reviewer to send it back first), inline_image (the answer adds an image as a data: URL; keep the images it already has and add new ones in AutoRFP), not_html (the answer is plain text or Markdown; send it as HTML). A requirement that does not exist or that the user cannot see returns an error instead.

Arguments

  • requirementIdstringrequired

    The `id` of the requirement, from list_requirements.

    non-empty

  • versionstringrequired

    The `version` returned by list_requirements for this requirement.

    non-empty

  • answerstringrequired

    The complete new answer, as HTML, at most 100000 characters.

    1 to 100000 characters

Request

curl -X POST "https://api.autorfp.ai/mcp" \
  -H "Authorization: Bearer $AUTORFP_ACCESS_TOKEN" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "update_requirement_answer",
    "arguments": {
      "requirementId": "8f14e45f",
      "version": "1",
      "answer": "<p>Updated text.</p>"
    }
  }
}'