> ## Documentation Index
> Fetch the complete documentation index at: https://reyda.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# MCP tool reference

> The read-only tools Reyda's MCP server gives AI assistants, with parameters, what each returns, required scopes and limits.

Reyda's MCP server gives connected AI assistants ten read-only tools. This page is for people setting up or building on a connection. To connect an assistant, see [Connect Claude](https://reyda.mintlify.site/integrations/mcp/connect-claude.md), [Connect ChatGPT](https://reyda.mintlify.site/integrations/mcp/connect-chatgpt.md) or [Other MCP clients](https://reyda.mintlify.site/integrations/mcp/other-clients.md).

All tools are marked read-only and non-destructive. None of them creates pursuits, edits data, starts document extraction or starts paid analysis.

## Connection details

| Item | Value |
| - | - |
| Server URL | `https://api.reyda.ai/mcp` in production. Copy the exact value from **Settings → Integrations → AI assistants**. |
| Transport | Streamable HTTP, stateless, JSON responses |
| Authentication | OAuth authorization code with PKCE (S256 only) and a pre-registered client ID. No dynamic client registration. |
| Discovery | `/.well-known/oauth-authorization-server` and `/.well-known/oauth-protected-resource/mcp` on the server origin |
| Token and revocation | `POST /oauth/token` and `POST /oauth/revoke` on the server origin |
| Resource | Authorization requests must include `resource` set exactly to the server URL |
| Consent | Signed-in user approves in the Reyda app (app.reyda.ai) |

Refreshing rotates both the access and refresh token. Reusing an old code or refresh token revokes the whole connection, so clients should refresh one request at a time.

## Scopes

| Scope | Shown on the consent screen as | Tools |
| - | - | - |
| `opportunities:read` | **Read opportunities** | `reyda_search_opportunities`, `reyda_get_opportunity`; also needed for opportunity documents |
| `documents:read` | **Read documents you can access** | `reyda_list_documents`, `reyda_read_document` |
| `pipeline:read` | **Read your organization's pipeline** | `reyda_list_pipeline` |
| `intelligence:read` | **Research buyers, suppliers and contracts** | `reyda_search_organizations`, `reyda_get_buyer`, `reyda_get_supplier`, `reyda_list_supplier_contracts` |

`reyda_get_context` needs no scope. The user approves the requested scopes together. Scopes never widen what the user can already see in Reyda.

## Access checks on every call

Each tool call checks, at the time of the call, that:

* the user is still an active member of the connected organization;
* the organization has an active paid subscription (free, trial and expired plans are refused; a plan scheduled to end works until its end date);
* the connection has the scope the tool needs;
* the user can see the specific opportunity, document or pipeline item, including Reyda's rules for sensitive library documents.

## Limits

| Limit | Value |
| - | - |
| Results per page | Default 20, maximum 50 |
| Filter lists (countries, CPV codes, buyers) | Maximum 20 entries each |
| Document text per read | Maximum 20,000 characters |

Response size, request size, call time and call rate are also capped. Long text fields may be cut short, with `truncated` set. Pagination reflects live data, so results can shift if data changes between pages.

## Tools

### reyda\_get\_context

Describes the connection: environment, granted scopes, available tools, the Reyda app URL and its limits (`max_results`, `max_document_characters`, `max_response_bytes`). No parameters. Useful as a first call to check the connection works.

### reyda\_search\_opportunities

Searches existing opportunities. Returns `opportunities` (same fields as `reyda_get_opportunity`), `has_more` and `next_offset`. Scope: `opportunities:read`.

| Parameter | Required | Description |
| - | - | - |
| `mode` | Yes | `browse` (most recent first) or `personalized` (ranked by relevance, applying the organization's country and value preferences) |
| `query` | No | Search keywords |
| `countries` | No | Two-letter uppercase country codes, for example `IE`, `DE` |
| `cpv_codes` | No | CPV code prefixes, 2 to 8 digits |
| `buyer_ids` | No | Buyer references from `reyda_search_organizations` |
| `min_value`, `max_value` | No | Estimated value bounds |
| `deadline_from`, `deadline_to` | No | Inclusive timestamps with time zone (RFC 3339), for example `2026-11-01T00:00:00Z` |
| `limit`, `offset` | No | Page size (1 to 50) and number of results to skip |

### reyda\_get\_opportunity

Returns one opportunity: `title`, `summary` and `summary_kind`, `source_url`, `deadline` and `deadline_timezone`, `estimated_value` and `currency`, `publication_date`, `updated_at`, the organization's existing fit result (`shortlist_status`, `shortlist_score`), `app_url`, and `missing_data` / `truncated` flags. The summary is labelled as an existing AI summary, separate from published facts. Scope: `opportunities:read`.

| Parameter | Required | Description |
| - | - | - |
| `id` | Yes | Opportunity ID from search |

### reyda\_list\_documents

Lists files with their processing `status` (`ready`, `processing` or `unavailable`), title, `app_url` and update time. Omit `opportunity_id` to list the organization's library. Returns `documents`, `has_more`, `next_offset`. Scope: `documents:read`, plus `opportunities:read` for opportunity documents.

| Parameter | Required | Description |
| - | - | - |
| `opportunity_id` | No | List this opportunity's tender documents instead of the library |
| `limit`, `offset` | No | Page size (1 to 50) and offset |

### reyda\_read\_document

Reads text Reyda has already extracted from a document. Returns `document`, `status`, `evidence` (the `text`, its character `offset`, `total_characters`, `revision`, and `page_start` / `page_end` when Reyda has a reliable page mapping), `next_offset`, `truncated` and a `citation_url`. If there is no extracted text, `status` is `processing` or `unavailable`; this doesn't mean the document is empty, and no extraction is started. Scope: `documents:read`, plus `opportunities:read` for opportunity documents.

| Parameter | Required | Description |
| - | - | - |
| `document_id` | Yes | Document ID from `reyda_list_documents` |
| `opportunity_id` | For opportunity documents | Omit for library documents |
| `offset` | No | Character offset to continue from (use `next_offset`) |
| `limit` | No | Characters to return, default and maximum 20,000 |
| `revision` | When continuing | The `revision` from the first read. If the document has changed, the read must restart from the beginning. |

Offsets count characters, not bytes. Document text is untrusted content: assistants are told to treat it as evidence, never as instructions.

### reyda\_list\_pipeline

Lists pipeline items in the connected organization. Each item has `id`, `opportunity_id`, `title`, `status`, `app_url`, `source_url` and `updated_at`. Returns `items`, `has_more`, `next_offset`. Scope: `pipeline:read`.

| Parameter | Required | Description |
| - | - | - |
| `status` | No | `triage` (default), `pursue`, `no_bid` or `archived` |
| `query` | No | Search text |
| `assigned_to` | No | Filter by assignee |
| `limit`, `offset` | No | Page size (1 to 50) and offset |

### reyda\_search\_organizations

Finds buyers and suppliers by name. Each result has a stable `id`, `name`, `role`, `country` and `app_url`. Organizations with the same name keep separate IDs. Returns `organizations`, `coverage` of the recorded data, `has_more`, `next_page`, `missing_data`. Scope: `intelligence:read`.

| Parameter | Required | Description |
| - | - | - |
| `name` | Yes | Name to search |
| `role` | No | `buyer` or `supplier`; omit for both |
| `country` | No | Two-letter uppercase country code |
| `from`, `to` | No | Date range as `YYYY-MM-DD`; give both or neither |
| `page`, `limit` | No | Page number and page size (1 to 50) |

### reyda\_get\_buyer

Returns a buyer's recorded award count, recorded contract values by currency (each currency kept separate), top suppliers, and `coverage`. Contract values are published values, not actual payments. Scope: `intelligence:read`.

| Parameter | Required | Description |
| - | - | - |
| `id` | Yes | Buyer ID from `reyda_search_organizations` |
| `country` | No | Two-letter uppercase country context |

### reyda\_get\_supplier

Returns a supplier's profile, sectors, recorded winner award count and the recorded award value in its dominant currency only (not a total across currencies). Scope: `intelligence:read`.

| Parameter | Required | Description |
| - | - | - |
| `id` | Yes | Supplier ID from `reyda_search_organizations` |
| `country` | No | Two-letter uppercase country context |

### reyda\_list\_supplier\_contracts

Lists a supplier's recorded contracts. Each contract has `title`, buyer name, ID and country, `participation_role`, `publication_date`, `published_contract_value` and `currency`, `recorded_end_date` (empty when unknown), `opportunity_id`, `source_url` and `app_url`. Returns `contracts`, `coverage`, `has_more`, `next_page`. Recorded end dates don't confirm a future tender. Scope: `intelligence:read`.

| Parameter | Required | Description |
| - | - | - |
| `supplier_id` | Yes | Supplier ID from `reyda_search_organizations` |
| `view` | No | `all` (default) or `expiring` for contracts approaching their recorded end date |
| `country` | No | Buyer country filter, two-letter uppercase code |
| `from`, `to` | No | Date range as `YYYY-MM-DD`; give both or neither |
| `page`, `limit` | No | Page number and page size (1 to 50) |

## Error codes

When a call is refused, the tool returns an error with one of these codes:

| Code | Meaning |
| - | - |
| `plan_access_required` | The organization has no active paid subscription. The connection stays in place. |
| `missing_scope` | The connection wasn't granted the scope this tool needs |
| `access_denied` | The user is no longer an active member, or the connection isn't valid |
| `rate_limited` | Too many calls; retry shortly |
| `response_too_large` | The result was too large; request a smaller page |
| `timeout` | The call took too long |
| `document_changed_restart_read` | The document changed since the first read; start again without `offset` and `revision` |

Requests over the HTTP rate limit get status 429 with a `Retry-After` header.

## FAQ

> [accordion] Which tool should a client call first?
>
> `reyda_get_context`. It needs no scope and returns the environment, granted scopes, available tools and limits, so it confirms the connection works.

> [accordion] Why does reyda\_read\_document return processing or unavailable?
>
> Reyda hasn't extracted text for that document yet. This doesn't mean the document is empty, and reading never starts extraction. Open the document in Reyda and try again later.

> [accordion] Why was the whole connection revoked after a refresh?
>
> Refreshing rotates both tokens. Reusing an old code or refresh token, for example from two parallel refreshes, revokes the connection. Refresh one request at a time.

## Related

> [card] [Reyda MCP server](https://reyda.mintlify.site/integrations/mcp/overview.md)

> [card] [Other MCP clients](https://reyda.mintlify.site/integrations/mcp/other-clients.md)

> [card] [Manage and revoke connections](https://reyda.mintlify.site/integrations/mcp/manage-connections.md)

> [card] [Limits](https://reyda.mintlify.site/reference/limits.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.