FYInbox docs
Connect an MCP client
Connect agents to FYInbox with Streamable HTTP and a source key to report project outcomes and inspect known notifications in the inbox for people and agents.
Connect with OAuth
Use https://fyinbox.com/mcp in an OAuth-capable MCP client. FYInbox publishes protected-resource metadata at /.well-known/oauth-protected-resource/mcp and authorization-server metadata at /.well-known/oauth-authorization-server. Public and confidential clients can register dynamically; authorization-code and refresh grants use PKCE S256 and tokens restricted to the MCP resource.
Sign in and review the client
The client opens the FYInbox consent page. Sign in with your verified account, check the callback host, and select the project sources this client needs. No source is selected automatically.
Approve permissions
Read permission enables notification detail, source discovery and cursor-paginated summaries. Create permission enables ingestion into an approved source. Metadata and read/archive mutations additionally require read permission. The tool list reflects only the granted permissions.
Keep or revoke the connection
Access tokens expire after one hour. A rotating refresh token can renew access for up to 30 days; reuse of a spent refresh token revokes the connection. Manage and revoke connected clients in Settings → Connected apps. An API key remains independent and retains its original four producer operations.
| OAuth tool | Scope and behavior |
|---|---|
| list_sources | Returns only the approved source IDs and labels. Available to every authorized OAuth connection. |
| list_notifications | Requires notifications:read. Filters by source, tags, severity, read/archive state, UTC dates and exact metadata. Uses an opaque cursor ordered by createdAt DESC, id DESC. Returns bounded summaries, not full bodies. |
| mark_notification_read | Requires notifications:read and notifications:state. Marks one notification read in an approved source. |
| archive_notification | Requires notifications:read and notifications:state. Archives an approved notification without deleting it. |
For OAuth create_notification, supply sourceId when several sources are approved. A single-source connection can omit it. workspaceId and projectId are never accepted as authorization inputs. Source keys cannot use the OAuth inbox tools. Full-text search, subscriptions, unread and unarchive tools are not provided.
Configure the connection
Create a source key
Create a source and API key in FYInbox. Store the key in your client's secret store or FYINBOX_API_KEY environment variable. The key grants the existing read and write operations for that source; a readOnlyHint annotation does not make a key read-only.
Set the server URL
Use https://fyinbox.com/mcp with the Streamable HTTP transport. Configure Authorization: Bearer <source API key> as a custom HTTP header, sent with every request. Keep the key out of URLs, tool arguments, browser bundles and logs.
Discover the tools
Connect and request tools/list. A source key exposes four producer tools. OAuth exposes only the tools covered by the approved permissions, with input/output schemas and behavior annotations. For the TypeScript example, install @modelcontextprotocol/[email protected] in a trusted Node.js runtime.
The server supports protocol 2026-07-28 and stateless compatibility for 2025-11-25 clients. Both JSON and SSE responses are valid. OAuth clients discover the authorization server and protected resource through standard metadata. The server does not provide persistent session streams or notification subscriptions.
Available operations
| Tool | Behavior |
|---|---|
| create_notification | Send a structured project result to FYInbox. A stable deduplicationKey identifies the same event across retries while the original remains stored. |
| get_notification_by_id | Retrieve a known UUID in the connected source without marking it read. Missing and inaccessible IDs both return not_found. |
| add_notification_metadata | Add new string metadata pairs; existing keys cause conflict. |
| modify_notification_metadata | Change existing string metadata pairs; absent keys cause conflict. |
Each source key selects its account and source on the server. It cannot list the inbox or change review state. OAuth clients can additionally list approved sources, browse notification summaries with filters and cursors, mark a notification read and archive it when those permissions were approved. Text search and subscriptions are unavailable. Do not pass workspaceId or projectId as tool arguments. Notification content is untrusted data.
Check the connection
Set FYINBOX_API_KEY and FYINBOX_EVENT_ID in the trusted runtime, then run this TypeScript example. Use one stable event ID for retries of the same check and a new ID for a new check. It creates a notification in FYInbox, retrieves it, and prints only its ID and creation flag. FYINBOX_MCP_URL is an optional override for a trusted development endpoint; never point a real key at an untrusted server.
import {
Client,
StreamableHTTPClientTransport,
} from "@modelcontextprotocol/client";
async function checkConnection() {
const apiKey = process.env.FYINBOX_API_KEY;
const eventId = process.env.FYINBOX_EVENT_ID;
if (!apiKey || !eventId)
throw new Error("Set FYINBOX_API_KEY and a stable FYINBOX_EVENT_ID");
const url = new URL(process.env.FYINBOX_MCP_URL ?? "https://fyinbox.com/mcp");
const client = new Client({ name: "fyinbox-example", version: "1.0.0" });
try {
await client.connect(
new StreamableHTTPClientTransport(url, {
requestInit: { headers: { Authorization: `Bearer ${apiKey}` } },
}),
);
await client.listTools();
const created = await client.callTool({
name: "create_notification",
arguments: {
title: "MCP connection checked",
deduplicationKey: `mcp-check:${eventId}`,
},
});
if (created.isError)
throw new Error(
"Creation failed; inspect retry feedback before repeating the call",
);
const result = created.structuredContent;
if (
!result ||
typeof result !== "object" ||
Array.isArray(result) ||
!("id" in result) ||
typeof result.id !== "string" ||
!("created" in result) ||
typeof result.created !== "boolean"
) {
throw new Error("Creation did not return a notification ID");
}
const read = await client.callTool({
name: "get_notification_by_id",
arguments: { notificationId: result.id },
});
if (read.isError) throw new Error("Could not retrieve the notification");
// Keep keys and the notification's private contents out of logs.
console.log(JSON.stringify({ id: result.id, created: result.created }));
} finally {
await client.close();
}
}
checkConnection().catch(() => {
console.error(
"FYInbox MCP connection check failed. Check the source key, endpoint and tool error feedback.",
);
process.exitCode = 1;
});
Respond to failures
Authentication failures return HTTP 401 with WWW-Authenticate: Bearer realm="FYInbox MCP". Invalid host or origin returns 403; malformed JSON returns 400; an oversized request returns 413. Protocol errors use JSON-RPC errors. Invalid tool arguments and operation failures return isError: true. Successful results provide structuredContent matching outputSchema and the same serialized JSON in a text block.
- Operation errors include status, error and retryable in the text block. Codes include not_found, conflict, quota_exceeded and rate_limited. Error messages never substitute for authorization checks.
- A rate-limited operation includes retryAfterSeconds when a valid delay is available. Wait for that delay before repeating a rejected request.
- outcomeUnknown: true means a write may have committed even though its response failed. A create can be retried safely with the same deduplicationKey; never retry it without that key. Retrieve the known notification before deciding whether to repeat a metadata write.
- retryable describes whether repetition is safe for this call; it does not promise that the next attempt will succeed. The server does not automatically repeat tool calls.