Limits and errors
An assistant should read these limits from the errors it gets rather than hard-code them, because plans and their numbers can change.
Prompts
Section titled “Prompts”MCP use is counted in prompts for each organization, not in tool calls. One question to an assistant may make several tool calls, and they count as one prompt.
- A prompt is up to 25 tool calls with no gap of more than 2 minutes between them. The next call after either limit starts a new prompt.
- Your organization’s plan sets how many prompts it has per day and per month. A day and a month are
the calendar day and month in UTC. The plan is one of
free,small,medium, orlarge. - A call that starts a new prompt when the organization has none left is refused. Calls inside a prompt that has already started are not.
These prompt quotas are separate from the API request quotas on Rate limits, which apply to programs that call the API directly.
Calls per minute
Section titled “Calls per minute”A person may make up to 30 tool calls a minute through one client, whatever the plan. A person may
also have a limited number of calls running at once. A call that waits more than a few seconds for
its turn is refused with Too many Fedwright requests at once; retry.
Size of results
Section titled “Size of results”A tool’s result is at most 64 KiB, counted for each of the two copies the server sends: the JSON in
structuredContent and the same JSON as text. The server never cuts a page of results short, since
the page’s cursor would then skip what was left out. What it does with a result that is too large
depends on the tool:
| Tool | A result over 64 KiB |
|---|---|
search_opportunities, list_new_since |
Leaves out the hits’ summaries and says so. A page still too large is refused (see below). |
search |
Leaves out otherMatches when the result has them. A page still too large is refused (see below). |
get_reference_codes |
Is refused (see below). |
get_notice, get_opportunity |
Shortens a notice’s description, or an opportunity’s lists of sources, links, and awards, and says so. |
get_details |
Leaves out the record’s source-specific detail and says so. |
get_organization, list_my_organizations |
Returns This result is too large to return., which is a failure on Fedwright’s side. |
A refused page names a limit that fits when one does: Call again with limit 7 or lower. When not
even one result fits, the refusal says the page is too large even with no results and asks you to
narrow the request, so there is no limit to try.
A page has at most 25 items, and 10 by default.
What a refused call looks like
Section titled “What a refused call looks like”A refused call is a tool execution error, not a protocol error. The call succeeds as a request,
and its result has isError: true and a text block that says what happened. This lets the assistant
read the message and correct itself or tell you. The server uses a protocol error only for a request
the MCP protocol itself rejects, such as an unknown tool.
A refusal because of a prompt or per-minute limit also carries the facts in structuredContent:
{ "isError": true, "content": [ { "type": "text", "text": "Prompt limit reached: 100 of 100 prompts used today for this organization. It resets at 00:00 UTC (2026-11-09T00:00:00Z)." } ], "structuredContent": { "limit": "mcp-prompts-day", "remaining": 0, "resetsAt": "2026-11-09T00:00:00Z", "used": 100 }}| Field | Meaning |
|---|---|
limit |
mcp-prompts-day, mcp-prompts-month, or mcp-tool-calls-minute. |
remaining |
What is left of that limit, never below 0. |
resetsAt |
When the limit starts again, in UTC. |
used |
How much of it is used. |
Other tool errors, by their text:
| Text starts with | Cause |
|---|---|
The arguments aren't valid for this tool: |
The input doesn’t fit the tool’s schema. The text names the parameters at fault. |
Approve this MCP client's access |
The client needs your approval. The text holds the link. See the overview. |
This notice was not found. |
There is no such notice, and likewise for an opportunity, a record, or an organization you can’t read. |
This cursor is invalid or expired. |
Start the search again without a cursor. |
Fedwright's rate limit was reached; retry after |
The API’s own limits were reached. Wait the seconds given, then retry. |
Sign in to the Fedwright web app to refresh MFA |
The operation needs a recent second-factor check. Sign in to the web app. |
Fedwright didn't accept this sign-in. |
The sign-in is no longer valid. Sign in to the client again. |
Fedwright could not complete this request. |
A failure on Fedwright’s side. Retry later. |
A request without a valid access token is not a tool error. The server answers it with HTTP 401
and the discovery challenge described in Any MCP client, and
the client signs in again.