Fulcra MCP Server
This MCP server lets an AI agent read and manage a Fulcra user’s context data, files, shares, groups, and agent communications.
Query health and context data, including workouts, sleep, location, calendars, calendar events, raw records, time series, and recent data updates.
Create, archive, restore, record to, and delete records from user-defined data types.
List, read, write, delete, restore versions of, and upload files in the user’s Fulcra account, including a file manager UI and chunked uploads.
Share files or data types with other Fulcra users or groups, list incoming/outgoing shares, revoke shares, and leave shares.
List, create, join, leave, and delete Fulcra groups.
Send agent-to-agent messages and coordinate via shared files/data.
Access data shared by other Fulcra users via
fulcra_userid.Retrieve user metadata/time zone info and debug local authentication credentials.
Mentioned as a communication channel for support, but not explicitly identified as an integration target for the MCP server.
Provides access to GitHub through the Fulcra API, allowing interaction with GitHub repositories. The MCP server maintains OAuth2 authentication for secure GitHub access without exposing tokens to MCP clients.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Fulcra MCP Servershow me my recent heart rate data"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
fulcra-context-mcp: An MCP server to access your Fulcra Context data
This is an MCP server that provides tools and resources to call the Fulcra API using fulcra-api.
There is a public instance of this server running at https://mcp.fulcradynamics.com/mcp. See https://docs.fulcradynamics.com/ to get started quickly. This repo is primarily for users who need to run the server locally, want to see under the hood, or want to help contribute.
When run on its own (or when FULCRA_ENVIRONMENT is set to stdio), it acts as a local MCP server using the stdio transport. Otherwise, it acts as a remote server using the Streamable HTTP transport. It handles the OAuth2 callback, but doesn't leak the exchanged tokens to MCP clients. Instead, it maintains a mapping table and runs its own OAuth2 service between MCP clients.
Remote Connection using Proxy
There is a public instance of this server running at https://mcp.fulcradynamics.com/. Point your OAuth2-capable MCP clients at that.
Local Connection
Example Claude Desktop config using uvx:
{
"mcpServers": {
"fulcra_context": {
"command": "uvx",
"args": [
"fulcra-context-mcp@latest"
]
}
}
}Model-facing tools
MCP discovery provides the current tool schemas and descriptions. Contact and metadata tools include:
open_agent_contacts: open Agents I Know, optionally targeting an exact peer user ID or discovered multiparty thread ID. Opening is read-only; rendering requires a host with MCP Apps support.update_data_type: update an owned active v1 Event/Metric type's name or description with user authorization and independent readback. It does not change schemas, records or shares; uncertain writes require reconciliation.
App-only implementation tools are not part of the public model-facing reference.
Debugging / Developer Tools
Agents I Know MCP App: run this checkout through a private development tunnel and test the ChatGPT sidebar UI. The HTML ships with this server, not a separate plugin server.
Both the MCP Inspector and mcp-remote tools can be useful in debugging.
Viewing Tools
Every MCP client is different, but many abbreviate tool and parameter descriptions for summaries. To avoid confusing client models, keep the initial descriptions short (full description in one line, around 80 characters).
While developing locally, the scripts/simulate_tools.py script simulates what this might look like to an MCP client:
FULCRA_ENVIRONMENT=stdio uv run python scripts/simulate_tools.py --command "uv run fulcra-context-mcp"Related MCP server: ultrahuman_mcp
Bugs / Feature Requests
Please feel free to reach out via the GitHub repo for this project or join our Discord to reach out directly. Email also works (support@fulcradynamics.com).
Available Tools
48 toolsarchive_data_typeArchive Data TypeADestructiveInspect
Archive (soft-delete) a user-defined data type.
The type and its recorded data are recoverable with restore_data_type. Only user-defined types (created via create_data_type or the Context app) can be archived.
| Name | Required | Description | Default |
|---|---|---|---|
| data_type | Yes | The "<BaseType>/<uuid>" ID from get_data_catalog. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the description's key contribution is qualifying that destructiveness: this is a soft-delete whose type and recorded data remain recoverable via restore_data_type. That materially changes the agent's risk calculus. It does not mention permission requirements or what the call returns, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and its soft-delete qualification, then the recovery path, then the eligibility constraint. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one fully documented parameter and annotations covering the safety profile, the description supplies the essential missing context (recoverability, eligibility). The only gap is any indication of what a successful call returns, which matters slightly more given there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter's description already specifies the '<BaseType>/<uuid>' ID format sourced from get_data_catalog. The tool description adds nothing about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Archive (soft-delete) a user-defined data type') and immediately clarifies the mutation's nature. It is clearly distinguishable from siblings like delete_file, delete_records, and restore_data_type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition (only user-defined types created via create_data_type or the Context app) and names restore_data_type as the inverse operation. It lacks an explicit 'use X instead when' routing statement, but the eligibility constraint effectively excludes the wrong cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_agent_invitationCreate Agent InvitationBDestructiveInspect
Create a new outbox labeled 's agent and prepare its single-person invitation code; with recipient_userid, share the outbox with exactly that user.
| Name | Required | Description | Default |
|---|---|---|---|
| inviter_name | Yes | The user's name. | |
| recipient_name | Yes | The invited person's name. | |
| recipient_userid | No | Optional exact Fulcra user ID of the invited person. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and openWorldHint=true, so the agent knows this mutates state and has external effects. The description adds useful context about what is produced (a new outbox and an invitation code) and the sharing side effect. It does not explain what makes the operation destructive — e.g., what happens if an outbox with that label already exists — nor anything about permissions or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the creation action and puts the conditional sharing clause after the semicolon. Efficient, though the '<recipient>'s agent' phrasing is slightly awkward to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and annotations carry the safety profile. What is missing is the destructive dimension: the description says what gets created but not what gets overwritten or lost, which is the one thing an agent most needs before calling a destructiveHint=true tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning: it ties recipient_name to the outbox label and explains the behavioral consequence of recipient_userid (the outbox is shared with exactly that user), which the schema's 'Optional exact Fulcra user ID' does not convey. inviter_name remains unexplained in the description, keeping this short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: create an outbox labeled '<recipient>'s agent' and prepare its single-person invitation code, with an optional sharing step. That is far more than a restatement of the name. However, it never distinguishes itself from the sibling tools prepare_agent_invitation and prepare_standing_agent_invitation, which an agent could easily confuse with it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only conditional given is about behavior ('with recipient_userid, share the outbox with exactly that user'), not about when to choose this tool. With three closely related invitation tools in the sibling list, the absence of any routing guidance or exclusion is a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_data_typeCreate Data TypeAInspect
Create a user-defined data type so the user can track something new.
For new tracking prefer base_type "event" (something that happens, at a time or over a range) or "metric" (a measured number); both can add custom fields. The older annotation bases "moment", "duration", "boolean", "numeric" and "scale" (a 1-5 rating) still work but take no fields.
Record with record_data (custom fields go in its fields);
get_data_catalog(data_type=) lists a type's fields; get_records reads
it back. Reversible with archive_data_type.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable name (e.g. "Caffeine Intake"). | |
| tags | No | Tag names to attach; missing tags are created. Annotation bases only. | |
| unit | No | Unit for recorded values (e.g. "mg"). metric/numeric only. | |
| scale | No | Value range, {"min": 1, "max": 10, "step": 1}. metric only. | |
| fields | No | JSON Schema of custom fields. event/metric only. E.g. {"properties": {"mood": {"type": "string"}}, "required": ["mood"]}. | |
| base_type | Yes | What kind of values this type records (see above). | |
| value_map | No | Labels for values, e.g. {"1": "low", "5": "high"}. metric only. | |
| description | No | What the type tracks. Required for event/metric. | |
| metric_kind | No | "cumulative" or "discrete". metric/boolean/numeric/scale only. | |
| scale_labels | No | Exactly 5 labels for the 1-5 scale values. scale only. | |
| default_value | No | Value pre-filled when recording. boolean/numeric only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive, closed-world, so the mutation profile is covered. The description adds genuine context beyond that: the operation is reversible via archive_data_type, and the base_type choice constrains whether fields can be used at all. It does not describe what the response returns or whether an error occurs on duplicate names, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the purpose, then base_type selection, then follow-up tools, then reversibility. No filler despite an 11-parameter tool; each sentence carries distinct routing or constraint information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, nested-object creation tool with no output schema, the description covers the hardest decision (which base_type) and the lifecycle (record, inspect, archive). Minor gaps remain around error/duplicate handling and validation failures when fields are passed to legacy base types.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description adds real semantic value the schema lacks: it explains the semantic distinction among base_type values (event vs metric vs legacy annotation bases) and the field-support constraint that the enum itself only hints at with "see above."
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create a user-defined data type") plus the intent (track something new), and immediately disambiguates the seven-way base_type enum by explaining what event/metric mean versus the legacy annotation bases. An agent can tell this apart from update_data_type or record_data without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear in-tool guidance for choosing a base_type ("For new tracking prefer event or metric") and flags that legacy bases take no custom fields. It also routes forward to record_data, get_data_catalog, get_records, and archive_data_type. What it omits is when NOT to use this tool — namely updating an existing type via the sibling update_data_type, or checking the catalog first to avoid duplicates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_groupCreate GroupAInspect
Create a group of Fulcra users, e.g. to share with several people at once.
Without data_types joining shares nothing; members just use the group
as a target for create_share. With data_types, every member shares
those types (within the time range) read-only with the user until they
leave; this cannot be changed later. Creating does not make the user a
member: call join_group too, or shares made to the group never reach
them. Anyone who learns the ID can join and the owner cannot remove
members, so treat it like a password. Only create a group the user asked for.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Group title shown to prospective members. | |
| time_end | No | End of the shared-data range. Must include tz (ISO8601). | |
| data_types | No | Data type IDs members will share (see `get_data_catalog`). Omit for a group that collects nothing. | |
| time_start | No | Start of the shared-data range. Must include tz (ISO8601). | |
| description | Yes | What the group is for. | |
| friendly_id | No | Human-friendly ID (lowercase letters, digits, "-", "_"). | |
| responsible_entity | Yes | Person or organization responsible for the group. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false) by disclosing consequences the agent cannot infer: sharing with `data_types` is permanent and cannot be changed later, the creator is not auto-joined, and the group ID is effectively a secret because anyone who learns it can join and the owner cannot remove members. These are exactly the risk facts an agent needs before invoking a creation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then progressively more conditional detail, with no filler sentences. The middle sentence about `data_types` is long and compound, but each clause carries distinct behavioral information, so the density is justified rather than wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with no output schema, the description covers the consequential behaviors, membership rules, and security posture thoroughly. The only gap is the return value — the group ID is only implied by 'anyone who learns the ID', not stated as what the call yields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics beyond the schema text: it explains what omitting `data_types` means (collects nothing) and that the time range bounds a read-only share that is immutable afterward. It does not clarify `friendly_id` or `responsible_entity` beyond the schema, keeping it at 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a group of Fulcra users') plus the motivation ('to share with several people at once'). It is clearly distinguishable from sibling tools like join_group, create_share, and get_groups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly branches on the `data_types` parameter (omit = nothing shared; include = members share read-only until they leave), names the follow-up tool (`join_group`) and the alternative target (`create_share`), and states a hard gating rule: 'Only create a group the user asked for.' That is when-to-use, when-not, and alternatives all in one place.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_token_infoDebug Token InfoARead-onlyInspect
Return info about the local session's Fulcra credentials.
Shows expiry and refresh-token presence for the stdio session's stored credentials. Useful for diagnosing authentication issues.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, so the description's job is to add beyond that, which it does: it discloses that it operates on the local stdio session's stored credentials and reveals only expiry and refresh-token *presence* rather than secret values. That last point is meaningful behavioral context about data exposure. It does not cover failure modes (e.g., behavior when no credentials are stored), keeping it at 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the purpose and followed by the diagnostic use case. Slightly redundant phrasing between 'local session's Fulcra credentials' and 'stdio session's stored credentials,' but nothing wasteful enough to drop it below 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by naming what is returned: expiry and refresh-token presence. For a zero-parameter, read-only diagnostic tool this is nearly complete; only edge-case behavior (missing credentials, expired session) is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline of 4 applies. No misleading parameter language is present.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return info about the local session's Fulcra credentials') and narrows scope to the stdio session's stored credentials, which distinguishes it from account-level tools like get_user_info or get_fulcra_settings. It stops short of naming a sibling explicitly, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use case: 'Useful for diagnosing authentication issues.' That is real guidance on when to reach for it. It does not state when not to use it or point at a specific alternative for auth debugging, so it is a 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_fileDelete FileADestructiveInspect
Delete a file stored in the user's Fulcra account.
This is a soft delete: earlier versions of the file are kept and can be
restored with restore_file (find version IDs via list_files with
include_versions=true).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The full path of the file to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, and the description adds the key mitigation: this is a SOFT delete, prior versions survive, and there is a documented restore path including how to find version IDs. That is exactly the kind of context annotations cannot convey and it materially changes how cautiously an agent treats this call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The operational fact (soft delete) is front-loaded immediately after the one-line purpose, and the cross-references to restore_file and list_files are actionable rather than decorative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter deletion tool with a destructive hint already declared, the description supplies the missing piece — reversibility and how to exercise it. No output schema is needed for a delete confirmation, and nothing an agent requires to call this safely is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'path' parameter is already documented as 'The full path of the file to delete.' The description adds no further syntax guidance (root-relative vs absolute, leading slash, behavior on non-existent paths), so it neither compensates nor detracts — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a file stored in the user's Fulcra account'), which cleanly separates it from siblings such as delete_records, delete_share, and archive_data_type. An agent knows exactly what is being removed and from where.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes the recovery path — 'earlier versions of the file are kept and can be restored with restore_file' — and tells the agent how to obtain version IDs via list_files with include_versions=true. It doesn't state explicit exclusions (e.g., when to prefer delete_records), but the context is clear enough to pick correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_recordsDelete RecordsADestructiveInspect
Delete records from one of the user's own v1 data types.
Takes the records' ids, as get_records returns them in each record's id
(record_data also returns the id of each record it creates). Deleted
records stop appearing in get_records within about a minute, for the user
and for anyone the type is shared with; anyone who already read them may
still have a copy.
| Name | Required | Description | Default |
|---|---|---|---|
| data_type | Yes | The ID of a v1 data type the user owns, e.g. "Event/<uuid>". | |
| record_ids | Yes | The ids of the records to delete, at most 500. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses key behavioral traits: deletions propagate to shared users within about a minute, previously read copies may persist, and only the user's own v1 data types are affected. This is exactly the kind of contextual risk information an agent needs for a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tight sentences: purpose first, ID provenance second, deletion effects third. Every sentence adds actionable information with no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with no output schema but clear annotations, the description covers what is deleted, which IDs to use, ownership constraints, visibility timing, and shared-user impact. No critical call-time context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds useful provenance for record_ids by explaining they are the IDs returned by get_records and record_data. The data_type parameter is also tied to the user's own v1 data types, reinforcing schema semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Delete records') and scopes it to 'one of the user's own v1 data types,' which clearly distinguishes it from file/share deletion siblings. It also names related tools (get_records, record_data) to anchor the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains the context for use by specifying that record IDs come from get_records or record_data, and that the data type must be owned by the user. It does not explicitly compare against alternatives such as archive_data_type, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
end_agent_contactEnd Agent ContactADestructiveIdempotentInspect
Stop sharing an owned single-peer Event channel and verify no grant remains; optionally archive it (restore_data_type undoes). Their share is unchanged.
| Name | Required | Description | Default |
|---|---|---|---|
| archive | No | Also archive the channel; records are kept. | |
| data_type | Yes | Owned Event/<uuid> channel. | |
| peer_userid | Yes | Exact UUID of its sole directly authorized peer. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false. The description adds useful behavioral context beyond that: it stops sharing, verifies no grant remains, optionally archives while retaining records, and notes restore_data_type can undo the archive and that the peer's share remains unchanged.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact, front-loaded sentence covering the primary action, verification, optional archive, undo path, and peer-share caveat. The final clause is slightly ambiguous, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations, full schema coverage, and output schema, the description is largely complete: it covers the mutation, archive option, undo path, and peer-share effect. It could be fuller about authorization or return behavior, but those are partly covered by structured fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already describes data_type as an owned Event/<uuid> channel, peer_userid as the exact sole authorized peer UUID, and archive as retaining records. The description reinforces the single-peer Event-channel scope and peer-share behavior, but adds little parameter-level syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: stopping sharing of an owned single-peer Event channel. The mention of verifying no grant remains and the restore_data_type undo path distinguishes it from generic share or data-type operations, though the contact-level framing could be slightly clearer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage by describing the action and an optional archive behavior, and it names restore_data_type as the undo alternative. However, it does not explicitly say when to choose this tool over sibling share or contact operations, nor does it state prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_calendar_eventsGet Calendar EventsARead-onlyInspect
Get the user's calendar events in a time range, or, without a range, list their calendars grouped by account/source.
Each carries a participant_count; pass include_participants=true when you need who was invited and their responses.
| Name | Required | Description | Default |
|---|---|---|---|
| end_time | No | Range end (exclusive). Must include tz (ISO8601). | |
| calendars | No | Events only: just these calendars (names or IDs); default is all. | |
| start_time | No | Range start (inclusive). Must include tz (ISO8601). | |
| fulcra_userid | No | Retrieve calendars or events of another Fulcra user (if shared) | |
| include_participants | No | Events only: include each event's participant list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and a closed-world scope, so safety is covered. The description adds non-obvious behavior beyond that: the output switches to a calendar list when no range is given, every event carries a participant_count, and participants are omitted unless explicitly requested. It does not mention result caps, pagination, or max range size, which keeps it at 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the primary capability and with the participant hint placed after. The participant guidance slightly overlaps the schema's own parameter description, a minor redundancy, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the work of explaining both possible return shapes and the participant_count field, which is the key information an agent needs. All parameters are optional and schema-documented, so the remaining gaps (pagination, ordering, timezone defaults) are modest rather than blocking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all five parameters are already documented in the schema, establishing a baseline of 3. The description adds rationale for include_participants ('when you need who was invited and their responses') and links the no-range case to the calendar listing, but says nothing extra about start_time/end_time exclusivity or the fulcra_userid sharing caveat.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get the user's calendar events) and explicitly covers both operating modes: a time-range query versus a no-range listing of calendars grouped by account/source. No sibling tool touches calendars, so no differentiation is needed, and the dual-mode framing is precise enough to predict the output shape.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance: supply a range to get events, omit it to get calendars, and set include_participants=true when attendee identities/responses are needed. It lacks explicit when-not guidance (e.g., preferred alternatives for other time sources like get_sleep or get_location), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contact_preferencesARead-onlyInspect
Read effective preferences for one of your own connections and peer.
Returns configuration values (global merged with this contact's overrides), not instructions.
| Name | Required | Description | Default |
|---|---|---|---|
| data_type | Yes | ||
| peer_userid | Yes | ||
| expected_peer_userids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe read-only operation, and the description adds useful behavioral context: the return values are global configuration merged with contact overrides, and they are configuration values rather than instructions. It does not cover auth/rate-limit details, but that is a minor gap given the annotations and output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no wasted text, and the core purpose is front-loaded before the important return-value clarification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema and annotations carry much of the burden, and the description usefully explains merge behavior and return type. However, with 0% schema description coverage on three parameters, the description should do more to explain how `data_type` and `expected_peer_userids` affect the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for three parameters. The description vaguely implies `peer_userid` by referring to a connection/peer, but it does not explain `data_type` or `expected_peer_userids`, leaving most parameter meaning undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific read operation on a specific resource: effective preferences for a contact/peer. It is distinguishable from the write-oriented sibling `set_contact_preferences`, though it does not explicitly name that sibling as an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by saying this reads effective preferences for one of your own connections. It does not explicitly state when to use this instead of `set_contact_preferences` or other settings-related siblings, so the guidance remains implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_catalogGet Data CatalogARead-onlyInspect
Get all data types available for this user, grouped by relevant MCP tool. Includes location, events, user-defined types and annotations, and measurements from connected devices.
Call this before requesting time-series data or raw records, and only use a data type with the tools named in its group. A type shared by another user carries that user's fulcra_userid; pass it to read their data.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional. Filter results by partial, case-insensitive name match. | |
| category | No | Optional. Filter by category. E.g. "healthkit", "annotations", "sleep", "mindfulness", "user_defined", "base_type". | |
| data_type | No | Optional. Return only the data type with this exact ID. For a user-defined type, this also lists its fields (what record_data takes in `fields`): a type name, or the field's JSON Schema if it has nested fields or rules; plus required_fields. For an annotation, it adds the annotation's own settings: scale and value labels (value_map), kind, unit, defaults, tags and display. | |
| fulcra_userid | No | Optional. Only the types this Fulcra user shares with you (your own ID: only your own types). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description still adds non-obvious behavior: results are grouped by MCP tool, the payload includes user-defined types and annotations plus device measurements, and shared types expose a foreign fulcra_userid for reading other users' data. Minor gap: nothing about result size or whether the catalog is paginated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight paragraphs, front-loaded with what the tool returns, followed by the call-ordering rule and the sharing caveat. No restatement of the name or title and no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With four optional filter parameters all documented and no output schema, the description carries the return-shape burden and does so at the level of the group/type structure. It stops short of describing the per-entry fields or how large the catalog response is, but an agent has enough to call it correctly and interpret the grouping.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the per-parameter baseline is 3. The description adds real semantics beyond that on fulcra_userid: types shared by another user carry that user's ID and passing it reads their data — a behavioral consequence the schema only hints at ('Only the types this Fulcra user shares with you').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get all data types available for this user') plus the organizing structure ('grouped by relevant MCP tool') and enumerates the included content areas: location, events, user-defined types, annotations, device measurements. This clearly separates it from the mutation siblings (create/update/archive/restore_data_type) and from consumers like get_time_series and get_records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite workflow: 'Call this before requesting time-series data or raw records,' which points the agent at get_time_series and get_records as downstream tools. It also adds a hard constraint — only use a data type with the tools named in its group — and explains the cross-user case where a type carries another user's fulcra_userid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_updatesGet Data UpdatesARead-onlyInspect
Summarize the data that arrived in the user's account during a period of time.
The time range filters on when records were processed/synced into Fulcra, NOT on the records' own timestamps — e.g. last night's sleep records typically arrive this morning. Use this to find out what new data exists since a previous check, then query the changed types with the appropriate tools.
| Name | Required | Description | Default |
|---|---|---|---|
| end_time | Yes | The end of the time range (exclusive). Must include tz (ISO8601). | |
| start_time | Yes | The start of the time range (inclusive). Must include tz (ISO8601). | |
| fulcra_userid | No | Check another Fulcra user's account instead. Only what they share is reported; poll to notice their agent's writes. | |
| include_shared | No | Also check every user who shares with this one. Adds a "shared" map keyed by their user ID (peers with no changes are omitted) and "peers_checked". At most 20 peers per call; any more are listed in "peers_skipped" to poll via fulcra_userid. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds the genuinely non-obvious behavioral fact that the window filters on processing/sync time rather than record timestamps, with a concrete sleep-record example. It stops short of describing the shape of the summary returned (counts vs. per-type breakdown), which is the one remaining gap for a no-output-schema tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose first, then the semantic caveat, then the intended follow-up action. Two short paragraphs, no filler, and the most error-prone detail (time-range meaning) is given its own emphasized block.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only discovery tool with four fully documented parameters and no output schema, the description covers when to call it, what the parameters mean semantically, and what to do next. Only the return structure is left implicit, which is a minor omission since the include_shared field documents the added keys.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so 3 would be the baseline, but the description adds meaning the schema cannot: start_time/end_time mean ingestion time, not event time. That reframing is the single most important parameter semantic for correct invocation and it is stated clearly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "Summarize the data that arrived in the user's account during a period of time." It also positions itself against the fetch siblings by naming the follow-up step ("query the changed types with the appropriate tools"), so an agent can distinguish this discovery tool from get_records/get_time_series without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes the workflow: use this to find out what new data exists since a previous check, then query the changed types with the appropriate tools. It also sets a clear boundary by declaring what the time range does NOT mean, which is exactly the mistake an agent would otherwise make.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fulcra_settingsARead-onlyInspect
Read the user's global contact preferences: configuration values, not instructions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| layout | Yes | |
| schema | Yes | |
| values | Yes | |
| checking_preferences | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds a non-trivial behavioral warning — that returned values are configuration, not directives — which guards against misinterpreting the payload as instructions. It stops short of describing scope or freshness of the values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the verb and resource first and the clarifying caveat second. Zero waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover the safety profile for a zero-parameter read. The remaining gap is scope: the description does not say what settings are covered or how this differs from get_contact_preferences, which is the main ambiguity an agent faces.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to document and the baseline is 4. The description correctly says nothing extraneous about parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('global contact preferences'), and clarifies the nature of the payload ('configuration values, not instructions'). However, it does not distinguish itself from the closely named sibling get_contact_preferences or explain how it relates to update_fulcra_settings, leaving an agent to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The read framing implies when to use it, and 'configuration values, not instructions' hints at how to treat the result, but there is no explicit when-to-use guidance or named alternative. With get_contact_preferences and update_fulcra_settings in the sibling list, the agent gets no routing help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_groupsGet GroupsARead-onlyInspect
List Fulcra groups, or get one group's full details.
A group is a set of Fulcra users; share with all of them at once by
passing its ID as with_group_ids to create_share. Lists public and
owned groups with long-form fields omitted (private groups the user
joined appear only with subscribed_only); pass group_id for one
group's complete record.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | Return this single group in full detail. | |
| subscribed_only | No | List only groups the user has joined. Entries then include the user's participant_id and joined_at. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and non-destructive, so the description is not burdened with safety details. It adds useful behavioral context: lists public and owned groups with long-form fields omitted, private joined groups appear only with subscribed_only, and group_id returns the complete record.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose and void of filler. The middle explanation is necessary for understanding listing behavior, though it could be slightly more compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list/get tool with full annotations and no output schema, the description covers what is returned and how filtering works. An agent has enough information to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds nuance beyond the schema: private groups the user joined appear only with subscribed_only, and group_id returns full detail, which clarifies the filtering behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs (List, get) and resource (Fulcra groups), and clearly distinguishes between listing multiple groups and retrieving a single group by ID. An agent can differentiate it from siblings like create_group or join_group.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains when to use listing vs single-group retrieval, and mentions sharing via create_share. However, it does not explicitly compare with alternatives like get_user_info for user lists, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_locationGet LocationARead-onlyInspect
Get where the user was: at one moment (time), or over a range
(start_time and end_time) as one location per sample_rate seconds.
Result timestamps include time zones. Always translate them to the user's local time zone when this is known.
| Name | Required | Description | Default |
|---|---|---|---|
| time | No | The moment to locate the user at. Must include tz (ISO8601). Without a sample at that exact time, the closest one within window_size seconds before or after is used. | |
| end_time | No | Range end (exclusive). Must include tz (ISO8601). | |
| start_time | No | Range start (inclusive). Must include tz (ISO8601). | |
| sample_rate | No | Range only: seconds per sample (default 900). | |
| window_size | No | Moment only: seconds around `time` to search for a sample (default 14400). | |
| change_meters | No | Range only: drop samples fewer than this many meters from the previous one. | |
| fulcra_userid | No | Retrieve data for another Fulcra user (if shared). | |
| include_after | No | Moment only: allow the closest sample to be after `time` (default true); false finds where the user last was at or before it. | |
| reverse_geocode | No | Include the address (default: true for a moment, false for a range). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe read-only operation with no destructive behavior. The description adds useful behavioral context beyond annotations: result timestamps include time zones, and agents should translate them to the user's local time zone when known. It does not cover pagination or error behavior, but that is less critical for a read-only lookup tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded, compact, and free of filler. Every sentence contributes either mode clarification or time-zone handling guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With nine parameters but complete schema descriptions and read-only annotations, the description is largely sufficient. It covers the moment/range distinction and timestamp time-zone handling, though without an output schema it could say a bit more about the returned location payload.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all nine parameters thoroughly. The description reinforces the meaning of `time`, `start_time`, `end_time`, and `sample_rate`, but adds little parameter-level detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Get where the user was") and clearly distinguishes the two supported modes: a single moment versus a range. It does not explicitly contrast itself with neighboring retrieval tools such as get_time_series or get_records, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains the two usage modes: use `time` for a moment and `start_time`/`end_time` for a range sampled every `sample_rate` seconds. It does not name alternatives or when-not conditions, but the mode selection context is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_message_check_statusBRead-onlyInspect
Read a selected private check configuration; omit the ID to discover choices.
| Name | Required | Description | Default |
|---|---|---|---|
| configuration_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds the discovery behavior of the omitted-ID case, but says nothing about what the private configuration contains or any permission requirements for reading it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the main action front-loaded and the discovery mode appended after the semicolon. No wasted words, though the phrasing is compressed to the point of slight ambiguity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the tool has one optional parameter whose two modes are both addressed. Only the meaning of 'check configuration' itself is left unexplained, a minor gap for a simple read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the semantics of configuration_id. It does explain that omitting it enumerates choices, which adds real meaning beyond the schema's default=null, but it never says what a valid ID looks like or what happens with an invalid one.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('private check configuration'), but the resource remains ambiguous — nothing explains what a 'check configuration' is or how it relates to the tool name 'message check status'. No sibling overlaps, so differentiation is not the issue, but the purpose stays vague.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause 'omit the ID to discover choices' is an explicit usage pattern for the no-argument case, which is genuinely useful. However, there is no guidance on when to supply an ID versus discover, nor any mention of alternatives or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recordsGet RecordsARead-onlyInspect
Retrieve raw records in a range, or the latest v1 record without dates.
Set latest=true and omit both dates for a single latest v1 record.
Works with every type listed by get_data_catalog, including user-defined
ones ("/" IDs); the correct API endpoint is chosen
automatically. Records that cover a time range are included when any part
of it intersects the requested window. Results are raw samples — they may
come from multiple sources and can overlap; for calculated per-interval
values of numeric data types, prefer get_time_series. Result
timestamps include time zones; translate them to the user's local time
zone when known.
| Name | Required | Description | Default |
|---|---|---|---|
| latest | No | Return one latest v1 record without a date range. | |
| end_time | No | Range end (exclusive). Must include tz (ISO8601). | |
| data_type | Yes | The data type ID, as returned by `get_data_catalog`. | |
| start_time | No | Range start (inclusive). Must include tz (ISO8601). | |
| fulcra_userid | No | Retrieve data for another Fulcra user (if shared); a shared type's get_data_catalog entry carries its owner's ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/non-destructive annotations, it discloses that the API endpoint is chosen automatically per type, that overlap/intersection semantics apply to range-covering records, that results are raw samples possibly drawn from multiple sources and may overlap, and that timestamps carry time zones needing conversion. That is exactly the kind of behavior an agent cannot infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior and the latest-mode rule are front-loaded in the first two sentences, with nuance (overlap, raw vs. calculated, timezone) following. No sentence is filler; each carries an operational constraint the agent would otherwise get wrong.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries return-value semantics itself — raw sample shape, possible multi-source overlap, and tz-bearing timestamps — and it does so. Combined with a fully documented input schema and read-only annotations, nothing needed to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes further by explaining the interaction between latest=true and omitting both dates, and by noting data_type accepts user-defined '<BaseType>/<uuid>' IDs — detail the schema only alludes to. It does not restate start/end exclusivity or the timezone format requirement, so it stops short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('retrieve raw records') plus two distinct modes (date range vs. latest-only), and explicitly contrasts itself with get_time_series for calculated values. An agent can distinguish it from get_time_series and get_data_updates without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use rules: 'Set latest=true and omit both dates for a single latest v1 record' and 'for calculated per-interval values of numeric data types, prefer get_time_series'. It also names get_data_catalog as the prerequisite for the data_type value, so the call ordering is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sleepGet SleepARead-onlyInspect
Return the user's sleep at a chosen level of detail; pick the coarsest that answers the question:
"aggregate": stage totals per period, for multi-day questions.
"cycles": one row per sleep session.
"stages": every stage interval; single-night detail.
Sleep crosses midnight, so extend the range to cover it. Stages: 0=In Bed, 1=Asleep/Unknown, 2=Awake, 3=Light, 4=Deep, 5=REM.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Level of detail (see above). | cycles |
| period | No | "aggregate" only: period length, e.g. "1d" (default) or "1w". | |
| stages | No | Only these stages (default: all). | |
| end_time | Yes | Range end (exclusive). | |
| time_zone | No | "aggregate" only: IANA zone for period bounds (default: the user's own). | |
| start_time | Yes | Range start (inclusive). | |
| fulcra_userid | No | Retrieve data for another Fulcra user (if shared). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It adds crucial domain behavior beyond annotations by explaining the data handling logic (extending the range across midnight) and providing a legend for the integer codes representing sleep stages. This level of detail significantly aids correct interpretation of the data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The structure is excellent, using bullet points and clear, functional language to convey complex options efficiently. Every sentence directly contributes to guiding the agent on how to invoke the tool correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is extremely thorough, covering not only the structural output (detail levels) but also the temporal data constraints (cross-midnight extension) and the underlying biological data representation (stage codes).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds necessary semantic depth by explaining the purpose of the 'level' enum choices and defining the specific values for the 'stages' array parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the purpose (returning user's sleep) and immediately distinguishes its core capability: providing sleep data at three distinct, clearly defined levels of granularity ('aggregate', 'cycles', 'stages').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides strong internal logic for usage, specifically detailing that 'aggregate' should be used for 'multi-day questions.' While it doesn't mention alternatives, it guides the agent on the appropriate choice of level based on the complexity of the required data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_time_seriesGet Time SeriesARead-onlyInspect
Get calculated per-interval time-series values for a single data type.
Only data types that get_data_catalog lists as usable with this tool are
supported; other types can be read with get_records. Result timestamps
include time zones; translate them to the user's local time zone when known.
| Name | Required | Description | Default |
|---|---|---|---|
| end_time | Yes | Range end (exclusive). Must include tz (ISO8601). | |
| data_type | Yes | The data type ID to retrieve (see `get_data_catalog`). | |
| start_time | Yes | Range start (inclusive). Must include tz (ISO8601). | |
| sample_rate | No | Seconds per sample; may be fractional. | |
| calculations | No | Extra per-slice calculations to include. One or more of "max", "min", "delta", "mean", "uniques", "allpoints", "rollingmean". Not supported on "cumulative" kinds. | |
| fulcra_userid | No | Retrieve data for another Fulcra user (if shared); a shared type's get_data_catalog entry carries its owner's ID. | |
| replace_nulls | No | Replace missing values (NA) with 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context: only catalog-listed types work, result timestamps include time zones, and callers should translate to the user's local time when known. It does not describe return shape or pagination, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with purpose and followed by eligibility constraints and timestamp handling advice. Every sentence adds useful information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with seven well-described parameters and safety annotations, the description covers purpose, supported data types, fallback behavior, and time zone handling. Because there is no output schema, the response shape is only implied rather than fully described, so it is strong but not maximally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters, including time zone requirements for start_time and end_time. The description does not add parameter-level detail beyond what the schema provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb, resource, and scope: 'Get calculated per-interval time-series values for a single data type.' It also distinguishes this tool from get_records for unsupported data types, so an agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says only data types listed by get_data_catalog as usable with this tool are supported, and directs other types to get_records. This gives clear when-to-use and when-not-to-use guidance with a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_infoGet User InfoBRead-onlyInspect
Return general info about the Fulcra user.
Returns user references such as time zone, calendar ids, and other metadata.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is clear. The description adds that the tool returns user references such as time zone and calendar ids, which is useful context about scope, but it does not elaborate on response structure or any behavioral traits beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences and front-loads the main purpose. It is appropriately sized, though the phrase 'general info' is slightly redundant with the following examples of returned data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description carries the burden of explaining return values. It lists a few example fields but leaves 'other metadata' vague, so an agent knows the general shape but not the full set of returned information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter semantics to document. The baseline for zero-parameter tools is 4, and the description does not introduce any confusing parameter-related claims.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: return general info about the Fulcra user. It gives examples of the data returned (time zone, calendar ids, metadata), but does not differentiate this from sibling tools like get_fulcra_settings or debug_token_info, leaving some ambiguity about scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. It does not mention prerequisites, exclusions, or sibling tools that might also return user-related information, so the agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workoutsGet WorkoutsARead-onlyInspect
Get details about the workouts that the user has done during a period of time. Result timestamps will include time zones. Always translate timestamps to the user's local time zone when this is known.
| Name | Required | Description | Default |
|---|---|---|---|
| end_time | Yes | the ending time of the period. Must include tz (ISO8601). | |
| start_time | Yes | The starting time of the period. Must include tz (ISO8601). | |
| fulcra_userid | No | Retrieve data for another Fulcra user (if shared) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuinely new behavioral context: result timestamps carry time zones and must be translated to the user's local zone, which is an output-handling instruction an agent would otherwise get wrong. It does not mention result caps or pagination, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero padding, with the core purpose front-loaded and the timezone handling note following as a distinct, actionable instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does at least tell the agent what to expect about timestamp formatting, and all three params are covered by the schema. It leaves open the shape of a workout record (fields, volume of results, ordering), which would matter for a data-returning tool with no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so start_time, end_time, and fulcra_userid are already fully documented, including the ISO8601 tz requirement. The description's 'period of time' phrasing restates the schema rather than adding syntax or constraint detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get details about the workouts') plus the scope ('during a period of time'), which cleanly separates it from siblings like get_sleep, get_location, and get_calendar_events. It stops short of explicitly naming those alternatives, so it earns a 4 rather than a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to reach for this tool versus get_records, get_time_series, or get_data_updates, all of which can also return time-ranged data. The time-window framing implies the use case but provides no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
join_groupJoin GroupAInspect
Join a Fulcra group on the user's behalf, at their explicit request.
Members can receive shares made to the group. If the group lists data
types (see get_groups), joining also shares those read-only with its
owner until the user leaves (see leave_group). Show the user the
group's details first. Anyone who knows a group's ID can join it.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | The group to join, from `get_groups`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses important behavior: members can receive group shares, joining may share listed data types read-only with the owner until the user leaves, and anyone with the group ID can join. This is exactly the kind of contextual risk and permission information an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the action and then adds necessary caveats and prerequisites. It is slightly longer than minimal but every sentence provides useful context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema, the description covers the prerequisite user request, the required display of group details, the sharing consequences, and the related leave_group action. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the single group_id parameter is already well documented in the schema. The description reinforces that the ID should come from get_groups, but adds no new syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: "Join a Fulcra group." It also distinguishes this action from sibling tools by referencing get_groups for details and leave_group for undoing membership.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage conditions: join only on the user's behalf and at their explicit request, and show the user the group's details first. It also explains the consequence of joining when the group lists data types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leave_groupLeave or Delete GroupADestructiveInspect
Leave a Fulcra group on the user's behalf, at their explicit request.
The user stops sharing the group's data types with its owner and stops receiving shares made to the group. With delete=true, instead permanently delete a group the user owns, removing every member; only when the user asks to delete it.
| Name | Required | Description | Default |
|---|---|---|---|
| delete | No | Delete the group for everyone (owner only) instead of leaving it. | |
| group_id | Yes | The group, from `get_groups`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint=true but say nothing specific; the description explains exactly what each mode does — leaving stops sharing data types with the owner and stops receiving group shares, while delete permanently removes every member and requires ownership. This is rich consequence disclosure well beyond the annotation flag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then layers the behavioral detail and the delete caveat. Two tight paragraphs with zero filler; every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, owner-sensitive two-parameter tool with no output schema, the description covers purpose, both operating modes, consequences, and the guardrail on deletion. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning to the `delete` flag beyond the schema: it removes every member, is permanent, requires ownership, and should only be used on explicit request. group_id is left to the schema, which already documents it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Leave a Fulcra group') and immediately distinguishes the leave vs delete variants. An agent can tell this apart from join_group, create_group, and get_groups without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage context: 'at their explicit request' and 'only when the user asks to delete it' clearly constrain when the destructive delete variant should fire. It doesn't name sibling tools as alternatives, but the verb makes the join/create distinction self-evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_filesList FilesARead-onlyInspect
List the files in the user's Fulcra account, or files another user shares.
Files can be used to pass data between agents: one agent writes a file with
write_file, others notice the change via get_data_updates and read it
with read_file.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | A folder to list (default "/"), or a single file's full path. | / |
| fulcra_userid | No | List another Fulcra user's shared files. Only shared paths, plus the parent folders leading to them, appear. | |
| include_versions | No | Return all stored versions of one file, newest first. `path` must then be a single file's full path. Version IDs can be passed to `restore_file`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful context about shared-user visibility and agent-to-agent file passing, but it does not disclose ordering, pagination, or response shape for a list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded with the core purpose and uses two short paragraphs with no repetition. Every sentence adds either scope or useful workflow context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description could say more about what a listing returns, such as file metadata or path structure. Still, for a simple read-only listing tool with fully documented parameters and safety annotations, it provides enough context to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents path, fulcra_userid, and include_versions thoroughly, including defaults and constraints. The description does not add syntax or semantic detail beyond what the schema provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: list files in the user's Fulcra account or files shared by another user. It also distinguishes the tool from read_file and write_file by explaining the inter-agent workflow, so an agent can tell what this tool is for without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context by explaining that files pass data between agents, one writes with write_file, others notice via get_data_updates, and read with read_file. However, it does not explicitly state when to choose list_files over alternatives like read_file, open_file_manager, or get_records, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
match_agent_invitationsMatch Agent InvitationsADestructiveInspect
Match unambiguous FIRST-message codes for user-prepared invitations using authenticated incoming-share owners, not sender claims. Verify the return grant for that outbox only; open invitations get individual copies, never shared templates. Labels ( via ) are display-only. Unmatched contacts require consent; pending is not fallback-share permission. No sends or preference changes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description adds important behavioral constraints: authenticated owner verification, individual copies for open invitations, display-only labels, consent requirements, and no sends or preference changes. It still does not explain what destructive state change justifies destructiveHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core matching action is front-loaded and every sentence appears to add a specific constraint. The wording is dense and jargon-heavy, making it harder to scan than ideal, but there is little obvious filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and rich annotations, the description need not explain return values. However, it still leaves the plain-language outcome of 'matching' unclear and never describes the destructive action implied by the annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter semantics burden. Schema coverage is also 100%, and the description does not need to compensate for missing parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: matching invitation codes for user-prepared invitations. It also distinguishes the operation from sender-claim-based matching and explicitly excludes sends, but it never names or contrasts the prepare/create invitation siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied through conditions like 'unambiguous FIRST-message codes' and 'not sender claims.' There is no explicit when-to-use guidance, no named alternatives, and no statement of when not to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_agent_contactsAgent ContactsBRead-onlyInspect
Open Agents I Know as a full panel; omit IDs for the list and Invite someone. Read-only. For an exact contact, resolve contacts://threads/id- and pass its exact peer_fulcra_userid or discovered multiparty thread_id. Names are not IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | No | ||
| peer_fulcra_userid | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so 'Read-only' is largely redundant. What the description does add is genuinely useful behavior: the no-argument call yields the list plus an Invite affordance, and 'Names are not IDs' warns about a common failure mode. It stops short of saying what the panel shows or whether it has side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler, and the read-only safety note is short. The opening clause 'Open Agents I Know as a full panel' is awkward and slightly opaque, and the URI-resolution guidance is compressed to the point of ambiguity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and annotations cover the safety profile; the description correctly focuses on parameterization and default behavior. It is still incomplete on the one thing an agent most needs, the distinction from open_agent_contacts_home and the other contact tools in the sibling set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does so: it explains that both thread_id and peer_fulcra_userid must be exact identifiers, that they are alternatives for pinpointing one contact, and that names cannot be substituted. The 'resolve contacts://threads/id-' instruction is the only unclear piece, but overall both parameters gain real meaning beyond the bare anyOf string schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'Open' plus the object 'Agents I Know as a full panel' establishes that this surfaces a UI panel rather than a data query, and 'omit IDs for the list and Invite someone' hints at the default view. However, the near-identical sibling open_agent_contacts_home is never mentioned, so an agent cannot tell them apart, and 'full panel' is loose phrasing for what is opened.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives conditional guidance for the parameter cases ('omit IDs for the list', 'for an exact contact ... pass its exact peer_fulcra_userid or discovered multiparty thread_id'). What it never states is when to choose this over open_agent_contacts_home or search_agent_contacts, which is the real routing decision for an agent facing 50 siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_agent_contacts_homeAgents I KnowARead-onlyInspect
Open Agents I Know, selecting the first available contact read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered structurally. The description adds genuine context beyond that — it preselects the first available contact rather than opening an empty view — but says nothing about what happens when no contacts exist or what the call actually returns to the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with zero filler, front-loaded on the verb and resource. Every clause earns its place by adding the preselection behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and a zero-param read-only navigation tool has a low bar. What remains thin is the edge-case behavior (empty contact list) and the relationship to the sibling contacts tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. The mention of "first available contact" implicitly clarifies that selection is automatic rather than caller-specified, which is a small plus.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Open) and a named resource/view ("Agents I Know"), plus the side effect of preselecting the first available contact. It is distinguishable from the generic open_agent_contacts sibling by the named view, though the description never says how the two differ.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: opening a named contact view suggests navigating to the contacts UI, but there is no explicit when-to-use, no when-not-to-use, and no reference to the obvious alternatives (open_agent_contacts, search_agent_contacts, open_file_manager) even though they appear as siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_file_managerOpen File ManagerBRead-onlyInspect
Show the user a file manager for their Fulcra files, where they can upload files from their computer (any type or size, such as spreadsheets) and download files. Use it when the user wants to upload or download files.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | The folder or exact file to open (default "/"). | / |
| fulcra_userid | No | Optional file owner. Shared files open read-only; access still requires a separate file share. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so the safety profile is covered. The description adds that this surfaces an interactive UI to the user and accepts any file type or size, which is useful context beyond the annotations. However, it omits the key behavioral trait an agent needs: whether the call blocks pending user interaction and what it returns (a path? a handle?) once the user uploads or downloads.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two front-loaded sentences, no filler. The parenthetical 'any type or size, such as spreadsheets' is a slightly incidental detail but it does convey a real capability, so it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param, no-output-schema tool with annotations, the description covers what the tool is but not the interaction model, which is the crux of a UI-opening tool: whether it blocks, what the agent should do afterwards, and how the resulting files relate to list_files. Adequate but with a clear gap for this tool's complexity archetype.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains 'path' (folder or exact file, default "/") and 'fulcra_userid' (file owner, shared files are read-only, separate share still required). The description adds nothing about either parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Show the user a file manager for their Fulcra files', and adds scope (upload from computer, download). It does not name or distinguish itself from the many headless file siblings (list_files, read_file, write_file, start_file_upload, upload_file_chunk), so an agent must infer that 'show the user' means an interactive UI rather than a programmatic operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use it when the user wants to upload or download files' gives a trigger condition, but it overlaps directly with start_file_upload/upload_file_chunk/write_file/read_file, which also serve upload and download intents. No exclusion or preference rule is given (e.g. 'use this only for interactive/bulk/ad-hoc transfers; use upload_file_chunk for scripted uploads'), leaving a real misroute risk.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_agent_invitationPrepare Agent InvitationBInspect
Prepare an invitation code at the user's request; authorizes only its matched return share. Include own_userid/code in the invite. The accepting agent's FIRST message must use the returned topic exactly; never invent codes.
| Name | Required | Description | Default |
|---|---|---|---|
| data_type | Yes | Exact owned, unshared Event/<uuid> channel. | |
| open_invitation | No | Reusable invitation with distinct open_invitation topic (not handshake). Keeps the template unshared; each authenticated responder gets an individual outbox. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false and openWorldHint=false, and the description adds useful constraints (never invent codes, use the returned topic exactly). However, the instruction to 'Include own_userid/code in the invite' references inputs that do not exist in the schema, which muddies rather than clarifies behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded with the purpose, but sentences are terse to the point of cryptic ('authorizes only its matched return share') and include off-schema references that consume attention without adding usable instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and annotations cover the safety profile. Still, the mismatch between described inputs (own_userid/code) and actual parameters leaves an agent uncertain how to construct a valid call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already explains data_type and open_invitation. The description adds no real semantics for either parameter and instead mentions own_userid/code, which is not a parameter at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Prepare an invitation code', with scope clarified as 'authorizes only its matched return share'. However, it never distinguishes itself from siblings like create_agent_invitation or prepare_standing_agent_invitation, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'at the user's request' implies a usage context, and the 'accepting agent's FIRST message' line describes downstream consumption. But there is no explicit when-to-use versus the closely named sibling invitation tools, leaving the choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_standing_agent_invitationStanding Open InvitationCDestructiveInspect
Get the user's standing open invitation (created on first use; private, never shared). Responders each get their own outbox via matching.
| Name | Required | Description | Default |
|---|---|---|---|
| inviter_name | No | Name to save for the invitation text; "" clears it, omit to keep. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description usefully discloses that the invitation is created implicitly on first use, that it is private and never shared, and that responders get isolated outboxes via matching — context the annotations do not convey. However, destructiveHint=true and readOnlyHint=false are only partially accounted for: the only mutation the description hints at is creation, while the schema's clearing behavior ("" empties the saved name) and its effect are never explained in prose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the resource and its most important property (private, never shared). The parenthetical is dense but earns its space; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and privacy/creation semantics are covered. But for a destructive, non-readonly tool in a large invitation-flow family, the description leaves out the side effects of clearing the name and any routing rules to the sibling invitation tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter's description already covers the set/clear/keep semantics for inviter_name, so the description need not repeat it. It adds nothing about the parameter, which is acceptable given full schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource and the key behavior ('standing open invitation', created on first use, private), but the verb 'Get' sits awkwardly against the tool name 'prepare' and the non-readOnly annotation. It never distinguishes this from the several closely related siblings (prepare_agent_invitation, create_agent_invitation, match_agent_invitations), which an agent will be choosing between.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus prepare_agent_invitation, create_agent_invitation, or match_agent_invitations, and no preconditions are given. The agent must infer call conditions from the name alone in a crowded invitation-flow family.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_fileRead FileARead-onlyInspect
Read a file from the user's Fulcra account, or one another user shares. Spreadsheets (.xlsx) come back as CSV, one section per sheet.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The full path of the file to read. | |
| as_link | No | Instead of the contents, return a link the user opens to download the file, e.g. a spreadsheet. It works for 10 minutes. | |
| max_bytes | No | Truncate text content beyond this many bytes (default 100000). Pass a larger value only when the full content is truly needed; large files consume a lot of context. | |
| fulcra_userid | No | Read a file of another Fulcra user (if shared). | |
| include_binary | No | Return other binary files base64-encoded (default false); this uses a lot of context. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description adds genuinely non-obvious behavior beyond that: spreadsheets are returned as CSV with one section per sheet, and the cross-user sharing scope. It omits the truncation-by-default and base64 behaviors, but those are documented in the schema fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both front-loaded with the primary action first and the format caveat second. Nothing is wasted and there is no restating of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with full schema coverage and annotations, the description covers source scope and the one surprising return-format behavior. A brief note on default truncation or that binary content is opt-in would make it complete, but the schema already carries those details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters (path, as_link, max_bytes, fulcra_userid, include_binary) are already fully explained in the schema. The description's clause about another user's shared files loosely corresponds to fulcra_userid but adds no syntax or format detail. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Read a file from the user's Fulcra account, or one another user shares'), which is enough to separate it from list_files/write_file/delete_file by operation. It stops short of explicitly naming those siblings, but the resource scope (shared vs. own files) is stated precisely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb — read a file when you need its contents — but there is no explicit when-to-use guidance (e.g. when to call read_file vs. list_files to discover a path, or when to use open_file_manager). No exclusions or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_dataRecord DataAInspect
Record a single record for a recordable data type.
Use get_data_catalog to find data types; user-defined ones use the
"/" ID form (create new ones with create_data_type).
Recorded data can be read back with get_records. For v1 types (including
user-defined Event and Metric types), the response gives the new record's
id, which get_records returns as the record's id and delete_records takes.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Free-text note stored with the record. | |
| tags | No | Tag names to attach; missing tags are created automatically. | |
| value | No | The value to record, for types that take one. E.g. "75.5" for numeric, "true" for boolean, "3" for scale. | |
| fields | No | Values for the data type's own fields, e.g. {"mood": "calm", "energy": 7}. get_data_catalog with data_type set lists a user-defined type's fields. | |
| end_time | No | When the recorded range ended. Must include tz (ISO8601). Only for duration-style types, where it is required. | |
| data_type | Yes | The ID of the data type to record to. | |
| record_id | No | v1 types only. The id (a UUID) to give the record. Leave it out and one is generated. To retry a send whose outcome is unknown, pass the id from the first attempt: a record sent again with the same id is stored as the same record, not a second one. | |
| start_time | No | When the record occurred; defaults to now. Must include tz. ISO8601. Duration-style types require it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With destructiveHint=false and readOnlyHint=false, the annotations already say this is a non-destructive write. The description adds genuine behavioral context beyond that: v1 types (including user-defined Event/Metric) return the new record's id, which get_records exposes as `id` and delete_records consumes. It does not mention auth or rate limits, but for a simple append-style write this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then the workflow routing, then return-value semantics. Four short sentences with no padding, though the opening line repeats the tool name awkwardly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description fills that gap by explaining what comes back (the record id for v1 types) and how downstream tools use it. For an 8-parameter tool at full schema coverage, the only real omission is error/retry behavior, which the `record_id` schema field already handles.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above baseline by specifying the '<BaseType>/<uuid>' ID form for user-defined types, which the `data_type` schema field does not say. It does not add anything about note, tags, or start/end_time beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (record) and resource (a single record of a data type), which an agent can distinguish from read/write siblings like get_records or write_file. The phrasing 'record a single record for a recordable data type' is slightly circular but the scope (single record, write) is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routes the agent through the workflow explicitly: get_data_catalog to find types, create_data_type for new ones, get_records to read back, delete_records for the returned id. It gives no condition for when NOT to use it (e.g., bulk vs single, versus write_file), so the exclusions are implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_data_typeRestore Data TypeAInspect
Restore an archived user-defined data type.
| Name | Required | Description | Default |
|---|---|---|---|
| data_type | Yes | The "<BaseType>/<uuid>" ID of the archived type. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose that this is a non-read-only, non-destructive, closed-world mutation. The description adds the meaningful precondition that the target must be archived, but it does not cover permissions, idempotency, error behavior, or what restoration entails.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no redundant or filler content. It is appropriately sized for a simple one-parameter operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity mutation with one fully documented parameter and annotations covering safety, the description is minimally adequate. It omits expected outcomes and failure conditions, which would help an agent invoke it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single parameter's format and meaning are fully documented in the schema. The description provides no additional parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Restore an archived user-defined data type'), making the operation clear. It does not explicitly differentiate from siblings such as archive_data_type or restore_file, but the resource and archived-state qualifier provide adequate clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'archived' implies the tool should be used only on archived types, giving minimal usage context. It does not explicitly state when to use this instead of alternatives or what happens if the type is not archived.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_fileRestore File VersionBInspect
Restore a previous version of a file in the user's Fulcra account.
| Name | Required | Description | Default |
|---|---|---|---|
| version_id | Yes | The UUID of the file version to restore. Found via list_files with include_versions=true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the agent knows this mutates the account but is framed as non-destructive. The description adds the versioning semantics ('a previous version'), implying version history is preserved, but says nothing about whether current file content is overwritten, whether the old head remains recoverable, or whether new versions are created.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the verb and resource arrive immediately. It is arguably under-specified rather than padded, so the efficiency is real but leaves value on the table.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation tool with no output schema and full schema coverage, the description covers the core action and annotations cover the safety profile. It stops short of explaining the effect on the current file head or what the caller gets back, which an agent invoking a restore operation would reasonably want.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage, including the UUID format and how to obtain it via list_files. The description adds nothing beyond the schema, which is the expected baseline when the schema fully documents the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (restore) and resource (a previous version of a file) scoped to the user's Fulcra account, so the agent knows exactly what operation is performed. It does not explicitly distinguish itself from the similarly named sibling restore_data_type, though the file-vs-data-type noun difference makes the split reasonably inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no when-to-use guidance, no prerequisites, and no named alternative. The useful routing hint ('version_id found via list_files with include_versions=true') lives only in the schema, not in the description text.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_agent_contactsSearch Agent Contact mentionsCRead-onlyInspect
Find Agent Contact opening actions for the composer without reading messages.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false. The description adds some useful behavioral context with "without reading messages," but it does not explain query behavior, result contents, or how this search differs from opening contacts directly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single front-loaded sentence with no filler, and the key verb appears immediately. The phrasing is somewhat cryptic, but it is structurally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter search tool with no output schema and no schema descriptions, the description should clarify the query semantics and expected return shape. It only hints at behavior ("without reading messages") and leaves the central search semantics unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has one required parameter, "query," but schema description coverage is 0%. The description does not specify what the query matches against (contact names, identifiers, opening actions, etc.) or what format it expects, so the schema gap is not compensated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description has a verb ("Find") and a resource ("Agent Contact opening actions"), so it is more than a tautology. However, "opening actions for the composer" is undefined and the description does not distinguish this from siblings like open_agent_contacts or open_agent_contacts_home.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool instead of open_agent_contacts, open_agent_contacts_home, or other contact/message tools. Usage is only implied by the phrase "for the composer."
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_agent_contact_messageSend Agent Contact MessageADestructiveInspect
Post to an existing exact-audience Event channel. Only status=posted confirms own-channel readback, not peer delivery. Uncertain retries: bounded, same mid and payload; never bypass denial. Replies/acks target messages/replies, not acks. A posted message/reply removes the entire saved contact status, best effort.
| Name | Required | Description | Default |
|---|---|---|---|
| mid | Yes | Stable UUID allocated before sending. | |
| pri | No | P1 urgent, P2 normal, P3 low. | P2 |
| body | Yes | Exact nonblank text, <=4000 characters. | |
| kind | No | Envelope kind. | message |
| slug | No | Topic; messages default to chat, answers inherit. | |
| outbox | Yes | Owned Event/<uuid> channel. | |
| sender | Yes | Agent name, <=128 characters. | |
| artifacts | No | File references: path, optional version/owner. No new shares. | |
| recipients | No | Agent names; omit for everyone. | |
| in_reply_to | No | Peer message/reply UUID within 30 days; required for reply/ack. | |
| peer_userid | Yes | Exact peer UUID. | |
| expected_peer_userids | No | Full other-user UUID audience; required for multiparty. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the annotations: delivery is not confirmed by status=posted, only own-channel readback is; retries must be bounded and reuse the same mid and payload; denial must never be bypassed; replies/acks target messages/replies, not acks; and a posted message/reply removes the entire saved contact status. These are important mutation, retry, and side-effect details for a destructive non-idempotent tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loads the core action before behavioral caveats. Some sentences are dense and jargon-heavy, such as the status=posted readback sentence, but there is little wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with an output schema, the description covers the important behavioral risks: partial delivery semantics, bounded retry rules, denial handling, reply/ack targeting, and the contact-status side effect. It is not fully complete because it does not clarify sibling selection against send_agent_message, but the key operational details are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already carries most parameter meaning. The description still adds useful semantics for retry behavior via the same mid and payload, and clarifies that replies/acks target messages/replies rather than acks, which goes beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and target: 'Post to an existing exact-audience Event channel.' That is more precise than a tautology, but it does not clearly distinguish this tool from the sibling send_agent_message or explain what makes the 'contact' variant different.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives some situational constraints, such as posting only to an existing exact-audience Event channel and not bypassing denial on retries. However, it does not explicitly say when to use this instead of send_agent_message or other contact tools, so the agent must infer the selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_agent_messageSend Agent MessageBInspect
Send over a connect-our-agents connection; everyone in it can read the message. Posted confirms own readback, not peer delivery. Never retry denial. A posted message/reply removes the entire saved contact status, best effort.
| Name | Required | Description | Default |
|---|---|---|---|
| ack | No | Peer message/reply UUID to acknowledge, within 30 days; never an ack. | |
| body | Yes | Nonblank message, <=4000 characters. | |
| topic | No | Thread name; replies inherit. | |
| sender | Yes | Stable agent name, <=128 characters. | |
| priority | No | P1 urgent, P2 normal (default), P3 low. | |
| reply_to | No | Peer message/reply UUID within 30 days; mutually exclusive with ack. | |
| artifacts | No | File references: path, optional version/owner. No new shares. | |
| record_id | No | Reuse returned UUID and unchanged payload for bounded uncertain retries. | |
| connection | Yes | Owned Event/<uuid> channel or exact peer UUID; channel required for multiparty. | |
| recipients | No | Agent names; omit for everyone. | |
| target_peer_userid | No | Multiparty reply/ack's exact owner UUID; never infer from sender. | |
| expected_peer_userids | No | Full other-user UUID audience; required for multiparty. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds important behavioral details, including that posting confirms only the sender's readback and that denial should never be retried. However, it also states that a posted message/reply removes the entire saved contact status, which is a destructive-side-effect disclosure that contradicts the destructiveHint=false annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the primary action. The sentences are terse and mostly meaningful, though some phrasing is compressed enough to be slightly ambiguous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema and output schema are rich, so the description need not explain parameters or return values. It does cover key delivery and side-effect caveats, but it fails to clarify the relationship to send_agent_contact_message and contains a side effect that conflicts with the annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 12 parameters in detail. The description adds audience context but does not provide additional per-parameter semantics beyond what the schema provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action and medium: sending a message over a connect-our-agents connection. It specifies the audience as everyone in that connection. However, it does not explicitly distinguish this tool from the sibling send_agent_contact_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'connect-our-agents connection' and the note that everyone in it can read the message. The warnings about retrying denial and readback status provide operational guidance, but there is no explicit statement of when to choose this tool over send_agent_contact_message.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_contact_identifierSet Agent Contact IdentifierADestructiveIdempotentInspect
Label your own Event channel or legacy outbox; changes only the description marker, verified by readback. Requires an unambiguous owned catalog entry. Labels are untrusted display text, not routing IDs or verified names.
| Name | Required | Description | Default |
|---|---|---|---|
| data_type | Yes | Owned Event/<uuid> or legacy MomentAnnotation/<uuid> catalog ID. | |
| identifier | Yes | Trimmed single-line text, 1..80 characters, no controls. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds meaningful context: only the description marker changes, the change is verified by readback, and the label is untrusted display text rather than routing identity. This goes beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and scope, followed by the prerequisite and trust caveat. Every sentence carries information, though the semicolon structure is slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter setter with no output schema, the description covers what is changed, the prerequisite, and the trust semantics of the label. It is nearly complete, though it could say more about overwrite behavior or error cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters fully. The description reinforces ownership and the trusted-display nature of the identifier but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: "Label your own Event channel or legacy outbox", making it clear this sets a display label on an owned catalog entry. It does not explicitly differentiate itself from siblings like set_contact_status or update_data_type, but the object and effect are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a prerequisite ("Requires an unambiguous owned catalog entry") and scope ("your own Event channel or legacy outbox"), which implies when to use it. However, it offers no explicit when-not conditions or named alternatives, leaving the agent to infer boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_contact_preferencesBDestructiveInspect
Replace this contact's preference overrides at the user's request; {} restores the global values.
Stored privately, never on the connection. No messages, sharing, checkpoints or scheduler edits.
| Name | Required | Description | Default |
|---|---|---|---|
| data_type | Yes | ||
| overrides | Yes | ||
| peer_userid | Yes | ||
| expected_peer_userids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the description adds real value by explaining that this is a full replacement (not a merge) and that passing {} reverts to global values — critical for a destructive override. The privacy note ('Stored privately, never on the connection') and the scope disclaimer about messages/sharing/checkpoints/scheduler further bound the blast radius, though the last clause is a bit ambiguous.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core semantics are front-loaded in the first clause, but the second line reads as a disjointed fragment ('No messages, sharing, checkpoints or scheduler edits') whose meaning is unclear without more context. It is compact with no padding, but the structure could be tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a destructive mutation with 4 parameters at 0% schema coverage, including an obscure expected_peer_userids safety parameter. An output schema exists, so return values needn't be explained, but the description omits what data_type and peer_userid mean and how expected_peer_userids guards concurrency — significant gaps for a destructive write.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 4 parameters, including a nested 'overrides' object, so the description carries the full burden. It only explains the overrides parameter ({} restores globals); data_type, peer_userid, and especially expected_peer_userids (a concurrency/locking parameter) are left entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Replace this contact's preference overrides', which clearly separates it from the read-only sibling get_contact_preferences. It does not explicitly name the sibling as an alternative, but the operation is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'at the user's request' gives a light trigger condition, and '{} restores the global values' explains the reset case. However, there is no explicit guidance on when to call this versus get_contact_preferences or how it interacts with set_contact_status, leaving usage implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_contact_statusSet Contact StatusADestructiveInspect
Save a peer-visible Status pill on your own Event connection, only with share_contact_status enabled and complete scoped reads. Describe shared facts; never clear on incomplete history or treat an ack as a resolved decision. Failure must not block other work; never retry denial.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Shared-status label; trimmed single-line Unicode, 1..80 code points, no controls. | |
| attention | Yes | Whether the user needs to attend to this conversation. | |
| data_type | Yes | Owned Event/<uuid> channel. | |
| peer_userid | Yes | Exact UUID of its sole directly authorized peer. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint=true and idempotentHint=false annotations, the description discloses useful behavioral constraints: the status is peer-visible, writes require complete scoped reads, failures must not block other work, and denials must not be retried. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very compact and front-loads the core action and precondition. Some phrasing is dense and slightly cryptic, but there is little wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With rich schema descriptions, an output schema, and annotations covering safety, the description supplies the key operational preconditions and failure-handling rules. It is largely complete, though it could better distinguish sibling tools and explain the status lifecycle.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the schema. The description adds conceptual context like shared facts and acknowledgements, but it does not add syntax or field-level meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific write action, 'Save a peer-visible Status pill,' and scopes it to the user's own Event connection. It is clearer than the title alone, but it does not explicitly distinguish this from related contact/status tools such as set_contact_identifier or set_contact_preferences.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit preconditions: share_contact_status must be enabled and scoped reads must be complete. It also gives when-not guidance such as never clearing on incomplete history and never retrying denial, though it does not name alternative sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_file_uploadStart File UploadCInspect
Starts an upload from the file manager panel.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Full path to write to. | |
| size | Yes | File size in bytes. | |
| content_type | No | MIME type; guessed if omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already state that this is not read-only, not destructive, and closed-world. The description adds little beyond that: it does not explain that this likely initiates an upload session, whether follow-up chunk calls are required, or what the caller should do next.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with little waste. However, the trailing "from the file manager panel" is vague and does not meaningfully improve the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although an output schema exists and annotations cover safety, the description omits the upload workflow relationship with upload_file_chunk. For an initiation tool in a file upload family, that context is important for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so path, size, and content_type are already documented sufficiently in the schema. The description adds no additional parameter meaning, which is acceptable given full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: it starts an upload. It does not distinguish this tool from the closely related upload_file_chunk sibling, and the phrase "from the file manager panel" adds UI context rather than clarifying the tool's role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus upload_file_chunk, write_file, or other file-related siblings. It also does not mention prerequisites or the upload workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_data_typeUpdate Data TypeADestructiveInspect
Update only name/description of an owned active Event/Metric type. Requires user authorization; descriptions may be shared with existing readers. Preserve unrelated description content. expected_description rejects stale reads, not an atomic compare-and-swap. Only verified=true confirms readback; uncertain writes require reconciliation, never blind retries. No schema, record, or share changes. Legacy annotations are not supported.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Replacement name; omit to preserve. | |
| data_type | Yes | Exact owned Event/<uuid> or Metric/<uuid> catalog ID. | |
| description | No | Complete replacement description; omit to preserve. | |
| expected_description | No | Description as last read from get_data_catalog; optional stale-read guard. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: descriptions are shared with existing readers, expected_description is a stale-read guard rather than an atomic compare-and-swap, only verified=true confirms readback, and blind retries are forbidden. Annotations cover the safety profile (destructive=true, idempotent=false) and the description layers the operational consequences on top.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the mutation scope, then the safety caveats, with no filler sentences. The phrasing is telegraphic in places ('Legacy annotations are not supported') which costs a little clarity, but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with an output schema, it covers everything an agent needs: authorization, field-replacement behavior, stale-read guarding, readback verification, and retry policy. Return-value detail is correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: 'Preserve unrelated description content' signals that description is a full replacement where partial edits destroy data, and 'expected_description rejects stale reads, not an atomic compare-and-swap' clarifies the concurrency guard's exact semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('Update only name/description of an owned active Event/Metric type') along with the constraints (owned, active). The explicit exclusion 'No schema, record, or share changes' separates it cleanly from create_data_type, archive_data_type, restore_data_type and record_data without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: user authorization required, read via get_data_catalog first, and reconcile rather than retry on uncertain writes. It does not explicitly contrast with sibling tools such as create_data_type or archive_data_type, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_fulcra_settingsBDestructiveInspect
Save global contact preferences the user chose, including checking_preferences text.
No messages, checkpoint changes or scheduler edits.
| Name | Required | Description | Default |
|---|---|---|---|
| set | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations disclose destructiveHint=true, but the description does not explain what may be overwritten, whether changes are reversible, or what permissions are needed. The exclusion sentence adds useful scope boundaries, but for a destructive settings update the description should say more about the destructive behavior beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no wasted wording, and the main purpose is front-loaded before the exclusions. It is appropriately sized for the available text, though the content itself is sparse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a destructive mutation tool with a nested object parameter and no schema field descriptions, and the description does not sufficiently explain the `set` payload or destructive implications. The output schema means return values need not be explained, but key invocation and safety context is still missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for a single nested `set` object with additionalProperties=true, so the schema itself provides little semantic guidance. The description mentions only checking_preferences text and does not explain the structure, required keys, or other accepted fields in `set`, leaving the parameter underspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: saving global contact preferences, including checking_preferences text. It does not explicitly distinguish this tool from sibling tools such as set_contact_preferences or get_contact_preferences, but the scope is still clear enough to identify the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The line "No messages, checkpoint changes or scheduler edits" gives useful negative guidance about what this tool is not for. However, it does not say when to choose this tool over alternatives like set_contact_preferences or get_fulcra_settings, so usage guidance remains implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_file_chunkUpload File ChunkCInspect
Sends one chunk of an upload from the file manager panel.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | The chunk, base64. | |
| offset | Yes | Chunk start, in bytes. | |
| upload_id | Yes | From start_file_upload. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnlyHint=false and destructiveHint=false, so safety is covered. The description adds little beyond 'from the file manager panel', which is irrelevant to an agent, and omits ordering, idempotency/retry, whether re-sending an offset overwrites data, and any size constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no padding, so it is concise, but the length comes at the cost of under-specification rather than efficiency. The useful part (chunk of an upload) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the input schema is fully documented, so the basics are covered. However, a chunked-upload step tool is incomplete without sequencing and finalization guidance, which the description entirely omits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each of upload_id, offset, and data is already documented in the schema. The description adds no extra meaning to any of the three parameters, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb+resource combo ('Sends one chunk of an upload') is specific about the action, but it never explains the chunked-upload protocol it belongs to or how it relates to start_file_upload. An agent knows it moves bytes but not the larger workflow it participates in.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all: not when to start chunking, how many times to call, whether chunks must be sequential, or what to call to finalize the upload. The only hint is the schema's note that upload_id comes from start_file_upload.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_fileWrite FileAInspect
Write a file to the user's Fulcra account.
Writing to an existing path creates a new version; earlier versions are
kept and can be restored with restore_file. Other agents can detect the
change through get_data_updates (under "file_changes") and read it with
read_file, so files are a good way to pass data between agents.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The full path to write to (e.g. "/agents/state.json"). | |
| content | No | The text to write, or with encoding="base64", the file's bytes base64-encoded (up to 5 MB). For larger files, or files the user has on their computer, use open_file_manager. | |
| encoding | No | "text" (default) or "base64". "upload_link" leaves content empty and returns a link to send a file on disk to, e.g. from a sandbox: `curl -T <file> <link>` (up to 30 MB). | text |
| content_type | No | Optional MIME type; guessed from the file name when left out (e.g. "application/json" for .json). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing non-obvious behavior: overwriting a path keeps prior versions (consistent with destructiveHint=false) and is reversible via restore_file, and writes are observable by other agents through get_data_updates under "file_changes". That side-effect visibility is exactly the kind of trait an agent cannot infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action in one sentence, then adds versioning and cross-agent visibility in tight follow-ups. Slightly prose-heavy line wrapping but every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param, fully documented, non-output tool with annotations present, this covers the semantics an agent needs to call it correctly. Only minor gaps, such as permission/auth requirements or path conventions, are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with path format, the 5 MB base64 cap, the upload_link flow, and MIME-type guessing all documented inline. The description adds nothing about parameters, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Write a file to the user's Fulcra account") and immediately qualifies the write semantics (new version on existing path). It is clearly separable from read_file, list_files, delete_file, and the chunked upload tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete context for when files are the right mechanism ("files are a good way to pass data between agents") and points to restore_file for recovering earlier versions. It does not explicitly route away from start_file_upload/upload_file_chunk in the description itself — that routing lives only in the content param's schema text.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
54 tool updates
v1.18.7- Removed
annotations_catalog - Changed
archive_data_type1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Added
create_agent_invitation - Changed
create_data_type34 fields changed- removed
Input schema / properties / default_value / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / default_value / defaultRemoved value: -null - added
Input schema / properties / default_value / typeAdded value: +"string" - removed
Input schema / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / description / defaultRemoved value: -null - added
Input schema / properties / description / typeAdded value: +"string" - added
Input schema / properties / fields / additionalPropertiesAdded value: +true - removed
Input schema / properties / fields / anyOfRemoved value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -] - removed
Input schema / properties / fields / defaultRemoved value: -null - added
Input schema / properties / fields / typeAdded value: +"object" - removed
Input schema / properties / metric_kind / anyOfRemoved value: -[ - { - "enum": [ - "cumulative", - "discrete" - ], - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / metric_kind / defaultRemoved value: -null - added
Input schema / properties / metric_kind / enumAdded value: +[ + "cumulative", + "discrete" +] - added
Input schema / properties / metric_kind / typeAdded value: +"string" - added
Input schema / properties / scale / additionalPropertiesAdded value: +{ + "type": "integer" +} - removed
Input schema / properties / scale / anyOfRemoved value: -[ - { - "additionalProperties": { - "type": "integer" - }, - "type": "object" - }, - { - "type": "null" - } -] - removed
Input schema / properties / scale / defaultRemoved value: -null - added
Input schema / properties / scale / typeAdded value: +"object" - removed
Input schema / properties / scale_labels / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / scale_labels / defaultRemoved value: -null - added
Input schema / properties / scale_labels / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / scale_labels / typeAdded value: +"array" - removed
Input schema / properties / tags / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / tags / defaultRemoved value: -null - added
Input schema / properties / tags / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / tags / typeAdded value: +"array" - removed
Input schema / properties / unit / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / unit / defaultRemoved value: -null - added
Input schema / properties / unit / typeAdded value: +"string" - added
Input schema / properties / value_map / additionalPropertiesAdded value: +{ + "type": "string" +} - removed
Input schema / properties / value_map / anyOfRemoved value: -[ - { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - { - "type": "null" - } -] - removed
Input schema / properties / value_map / defaultRemoved value: -null - added
Input schema / properties / value_map / typeAdded value: +"object" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Changed
create_group16 fields changed- removed
Input schema / properties / data_types / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / data_types / defaultRemoved value: -null - added
Input schema / properties / data_types / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / data_types / typeAdded value: +"array" - removed
Input schema / properties / friendly_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / friendly_id / defaultRemoved value: -null - added
Input schema / properties / friendly_id / typeAdded value: +"string" - removed
Input schema / properties / time_end / anyOfRemoved value: -[ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / time_end / defaultRemoved value: -null - added
Input schema / properties / time_end / formatAdded value: +"date-time" - added
Input schema / properties / time_end / typeAdded value: +"string" - removed
Input schema / properties / time_start / anyOfRemoved value: -[ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / time_start / defaultRemoved value: -null - added
Input schema / properties / time_start / formatAdded value: +"date-time" - added
Input schema / properties / time_start / typeAdded value: +"string" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Changed
create_share25 fields changed- removed
Input schema / properties / data_types / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / data_types / defaultRemoved value: -null - added
Input schema / properties / data_types / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / data_types / typeAdded value: +"array" - removed
Input schema / properties / file_paths / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / file_paths / defaultRemoved value: -null - added
Input schema / properties / file_paths / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / file_paths / typeAdded value: +"array" - removed
Input schema / properties / time_end / anyOfRemoved value: -[ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / time_end / defaultRemoved value: -null - added
Input schema / properties / time_end / formatAdded value: +"date-time" - added
Input schema / properties / time_end / typeAdded value: +"string" - removed
Input schema / properties / time_start / anyOfRemoved value: -[ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / time_start / defaultRemoved value: -null - added
Input schema / properties / time_start / formatAdded value: +"date-time" - added
Input schema / properties / time_start / typeAdded value: +"string" - removed
Input schema / properties / with_group_ids / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / with_group_ids / defaultRemoved value: -null - added
Input schema / properties / with_group_ids / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / with_group_ids / typeAdded value: +"array" - removed
Input schema / properties / with_user_ids / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / with_user_ids / defaultRemoved value: -null - added
Input schema / properties / with_user_ids / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / with_user_ids / typeAdded value: +"array" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Changed
debug_token_info1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Changed
delete_file1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Removed
delete_group - Changed
delete_records1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Changed
delete_share2 fields changed- changed
Input schema / properties / share_id / descriptionPrevious value: -"The \"datashare_id\" from `list_shares(direction=\"outgoing\")`."New value: +"From list_shares: an outgoing share's \"datashare_id\", or an\nincoming share's \"grant_id\"." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Added
end_agent_contact - Changed
get_calendar_events12 fields changed- removed
Input schema / properties / calendars / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / calendars / defaultRemoved value: -null - changed
Input schema / properties / calendars / descriptionPrevious value: -"Only these calendars (names or IDs); default is all."New value: +"Events only: just these calendars (names or IDs); default is all." - added
Input schema / properties / calendars / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / calendars / typeAdded value: +"array" - removed
Input schema / properties / fulcra_userid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / fulcra_userid / defaultRemoved value: -null - changed
Input schema / properties / fulcra_userid / descriptionPrevious value: -"Retrieve events of another Fulcra user (if shared)"New value: +"Retrieve calendars or events of another Fulcra user (if shared)" - added
Input schema / properties / fulcra_userid / typeAdded value: +"string" - changed
Input schema / properties / include_participants / descriptionPrevious value: -"Include each event's participant list."New value: +"Events only: include each event's participant list." - removed
Input schema / requiredRemoved value: -[ - "start_time", - "end_time" -] - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Removed
get_calendars - Added
get_contact_preferences - Changed
get_data_catalog14 fields changed- removed
Input schema / properties / category / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / category / defaultRemoved value: -null - added
Input schema / properties / category / typeAdded value: +"string" - removed
Input schema / properties / data_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / data_type / defaultRemoved value: -null - changed
Input schema / properties / data_type / descriptionPrevious value: -"Optional. Return only the data type with this exact ID.\nFor a user-defined type, this also lists its fields (what\nrecord_data takes in `fields`): a type name, or the field's JSON\nSchema if it has nested fields or rules; plus required_fields."New value: +"Optional. Return only the data type with this exact ID.\nFor a user-defined type, this also lists its fields (what\nrecord_data takes in `fields`): a type name, or the field's JSON\nSchema if it has nested fields or rules; plus required_fields.\nFor an annotation, it adds the annotation's own settings: scale and\nvalue labels (value_map), kind, unit, defaults, tags and display." - added
Input schema / properties / data_type / typeAdded value: +"string" - removed
Input schema / properties / fulcra_userid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / fulcra_userid / defaultRemoved value: -null - added
Input schema / properties / fulcra_userid / typeAdded value: +"string" - removed
Input schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / name / defaultRemoved value: -null - added
Input schema / properties / name / typeAdded value: +"string" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Changed
get_data_updates4 fields changed- removed
Input schema / properties / fulcra_userid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / fulcra_userid / defaultRemoved value: -null - added
Input schema / properties / fulcra_userid / typeAdded value: +"string" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Added
get_fulcra_settings - Changed
get_groups4 fields changed- removed
Input schema / properties / group_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / group_id / defaultRemoved value: -null - added
Input schema / properties / group_id / typeAdded value: +"string" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Added
get_location - Removed
get_location_at_time - Removed
get_location_time_series - Added
get_message_check_status - Changed
get_records6 fields changed- removed
Input schema / properties / fulcra_userid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / fulcra_userid / defaultRemoved value: -null - added
Input schema / properties / fulcra_userid / typeAdded value: +"string" - added
Input schema / properties / latestAdded value: +{ + "default": false, + "description": "Return one latest v1 record without a date range.", + "type": "boolean" +} - changed
Input schema / requiredPrevious value: -[ - "data_type", - "start_time", - "end_time" -]New value: +[ + "data_type" +] - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Changed
get_sleep24 fields changed- removed
Input schema / properties / agg_functionsRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "\"aggregate\" level only. E.g. \"sum\", \"mean\" (default [\"sum\"])." -} - removed
Input schema / properties / clip_to_rangeRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": true, - "description": "Clip results to the requested range (default True)." -} - removed
Input schema / properties / cycle_gapRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Minimum interval separating distinct cycles (e.g. \"PT2H\")." -} - changed
Input schema / properties / end_time / descriptionPrevious value: -"Range end (exclusive). Must include tz (ISO8601)."New value: +"Range end (exclusive)." - added
Input schema / properties / fulcra_useridAdded value: +{ + "description": "Retrieve data for another Fulcra user (if shared).", + "type": "string" +} - removed
Input schema / properties / gap_stagesRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "integer" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Stage integers treated as gaps between cycles." -} - removed
Input schema / properties / merge_contiguousRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "\"stages\" level only. Merge adjacent same-stage samples (default True)." -} - removed
Input schema / properties / merge_overlappingRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "\"stages\" level only. Merge overlapping stages (default True)." -} - removed
Input schema / properties / modeRemoved value: -{ - "anyOf": [ - { - "enum": [ - "start", - "end", - "split" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "\"aggregate\" only. Assign by \"start\", \"end\" or \"split\" (default \"end\")." -} - removed
Input schema / properties / period / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / period / defaultRemoved value: -null - changed
Input schema / properties / period / descriptionPrevious value: -"\"aggregate\" level only. Period length, e.g. \"1d\", \"1w\" (default \"1d\")."New value: +"\"aggregate\" only: period length, e.g. \"1d\" (default) or \"1w\"." - added
Input schema / properties / period / typeAdded value: +"string" - removed
Input schema / properties / stages / anyOfRemoved value: -[ - { - "items": { - "type": "integer" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / stages / defaultRemoved value: -null - changed
Input schema / properties / stages / descriptionPrevious value: -"Stage integers to include (default: all)."New value: +"Only these stages (default: all)." - added
Input schema / properties / stages / itemsAdded value: +{ + "type": "integer" +} - added
Input schema / properties / stages / typeAdded value: +"array" - changed
Input schema / properties / start_time / descriptionPrevious value: -"Range start (inclusive). Must include tz (ISO8601)."New value: +"Range start (inclusive)." - removed
Input schema / properties / time_zone / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / time_zone / defaultRemoved value: -null - changed
Input schema / properties / time_zone / descriptionPrevious value: -"\"aggregate\" only. IANA tz for period bounds; use the user's local one."New value: +"\"aggregate\" only: IANA zone for period bounds (default: the\nuser's own)." - added
Input schema / properties / time_zone / typeAdded value: +"string" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Changed
get_time_series12 fields changed- removed
Input schema / properties / calculations / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / calculations / defaultRemoved value: -null - added
Input schema / properties / calculations / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / calculations / typeAdded value: +"array" - removed
Input schema / properties / fulcra_userid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / fulcra_userid / defaultRemoved value: -null - added
Input schema / properties / fulcra_userid / typeAdded value: +"string" - removed
Input schema / properties / replace_nulls / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Input schema / properties / replace_nulls / typeAdded value: +"boolean" - removed
Input schema / properties / sample_rate / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Input schema / properties / sample_rate / typeAdded value: +"number" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Changed
get_user_info1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Changed
get_workouts4 fields changed- removed
Input schema / properties / fulcra_userid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / fulcra_userid / defaultRemoved value: -null - added
Input schema / properties / fulcra_userid / typeAdded value: +"string" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Changed
join_group1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Changed
leave_group3 fields changed- added
Input schema / properties / deleteAdded value: +{ + "default": false, + "description": "Delete the group for everyone (owner only) instead of leaving it.", + "type": "boolean" +} - changed
Input schema / properties / group_id / descriptionPrevious value: -"The group to leave, from `get_groups(subscribed_only=true)`."New value: +"The group, from `get_groups`." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Removed
leave_share - Changed
list_files4 fields changed- removed
Input schema / properties / fulcra_userid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / fulcra_userid / defaultRemoved value: -null - added
Input schema / properties / fulcra_userid / typeAdded value: +"string" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Changed
list_shares1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Added
match_agent_invitations - Added
open_agent_contacts - Added
open_agent_contacts_home - Changed
open_file_manager3 fields changed- added
Input schema / properties / fulcra_useridAdded value: +{ + "description": "Optional file owner. Shared files open read-only;\naccess still requires a separate file share.", + "type": "string" +} - changed
Input schema / properties / path / descriptionPrevious value: -"The folder to open (default \"/\")."New value: +"The folder or exact file to open (default \"/\")." - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Added
prepare_agent_invitation - Added
prepare_standing_agent_invitation - Changed
read_file4 fields changed- removed
Input schema / properties / fulcra_userid / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / fulcra_userid / defaultRemoved value: -null - added
Input schema / properties / fulcra_userid / typeAdded value: +"string" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Changed
record_data26 fields changed- removed
Input schema / properties / end_time / anyOfRemoved value: -[ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / end_time / defaultRemoved value: -null - added
Input schema / properties / end_time / formatAdded value: +"date-time" - added
Input schema / properties / end_time / typeAdded value: +"string" - added
Input schema / properties / fields / additionalPropertiesAdded value: +true - removed
Input schema / properties / fields / anyOfRemoved value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } -] - removed
Input schema / properties / fields / defaultRemoved value: -null - added
Input schema / properties / fields / typeAdded value: +"object" - removed
Input schema / properties / note / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / note / defaultRemoved value: -null - added
Input schema / properties / note / typeAdded value: +"string" - removed
Input schema / properties / record_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / record_id / defaultRemoved value: -null - added
Input schema / properties / record_id / typeAdded value: +"string" - removed
Input schema / properties / start_time / anyOfRemoved value: -[ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / start_time / defaultRemoved value: -null - added
Input schema / properties / start_time / formatAdded value: +"date-time" - added
Input schema / properties / start_time / typeAdded value: +"string" - removed
Input schema / properties / tags / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / tags / defaultRemoved value: -null - added
Input schema / properties / tags / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / tags / typeAdded value: +"array" - removed
Input schema / properties / value / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / value / defaultRemoved value: -null - added
Input schema / properties / value / typeAdded value: +"string" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Changed
restore_data_type1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Changed
restore_file1 field changed- changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
- Added
search_agent_contacts - Added
send_agent_contact_message - Changed
send_agent_message36 fields changed- removed
Input schema / properties / ack / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / ack / defaultRemoved value: -null - changed
Input schema / properties / ack / descriptionPrevious value: -"The id of their message you've read but can't answer yet."New value: +"Peer message/reply UUID to acknowledge, within 30 days; never an ack." - added
Input schema / properties / ack / typeAdded value: +"string" - added
Input schema / properties / artifactsAdded value: +{ + "description": "File references: path, optional version/owner. No new shares.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" +} - changed
Input schema / properties / body / descriptionPrevious value: -"The message text, at most 4000 characters."New value: +"Nonblank message, <=4000 characters." - changed
Input schema / properties / connection / descriptionPrevious value: -"Your channel's ID (\"Event/<uuid>\"), or the other person's\nFulcra user ID."New value: +"Owned Event/<uuid> channel or exact peer UUID; channel required for multiparty." - added
Input schema / properties / expected_peer_useridsAdded value: +{ + "description": "Full other-user UUID audience; required for multiparty.", + "items": { + "type": "string" + }, + "type": "array" +} - removed
Input schema / properties / priority / anyOfRemoved value: -[ - { - "enum": [ - "P1", - "P2", - "P3" - ], - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / priority / defaultRemoved value: -null - changed
Input schema / properties / priority / descriptionPrevious value: -"P1 (urgent), P2 or P3."New value: +"P1 urgent, P2 normal (default), P3 low." - added
Input schema / properties / priority / enumAdded value: +[ + "P1", + "P2", + "P3" +] - added
Input schema / properties / priority / typeAdded value: +"string" - removed
Input schema / properties / recipients / anyOfRemoved value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -] - removed
Input schema / properties / recipients / defaultRemoved value: -null - changed
Input schema / properties / recipients / descriptionPrevious value: -"Agent names the message is for; leave out for everyone."New value: +"Agent names; omit for everyone." - added
Input schema / properties / recipients / itemsAdded value: +{ + "type": "string" +} - added
Input schema / properties / recipients / typeAdded value: +"array" - removed
Input schema / properties / record_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / record_id / defaultRemoved value: -null - changed
Input schema / properties / record_id / descriptionPrevious value: -"To retry a send whose outcome is unknown, the id it\nreturned, so it isn't sent twice."New value: +"Reuse returned UUID and unchanged payload for bounded uncertain retries." - added
Input schema / properties / record_id / typeAdded value: +"string" - removed
Input schema / properties / reply_to / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / reply_to / defaultRemoved value: -null - changed
Input schema / properties / reply_to / descriptionPrevious value: -"The id of their message this answers (from get_records)."New value: +"Peer message/reply UUID within 30 days; mutually exclusive with ack." - added
Input schema / properties / reply_to / typeAdded value: +"string" - changed
Input schema / properties / sender / descriptionPrevious value: -"Your agent's name; use the same one every time."New value: +"Stable agent name, <=128 characters." - added
Input schema / properties / target_peer_useridAdded value: +{ + "description": "Multiparty reply/ack's exact owner UUID; never infer from sender.", + "type": "string" +} - removed
Input schema / properties / topic / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / topic / defaultRemoved value: -null - changed
Input schema / properties / topic / descriptionPrevious value: -"A short thread name; replies reuse it by default."New value: +"Thread name; replies inherit." - added
Input schema / properties / topic / typeAdded value: +"string" - added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Added
set_contact_identifier - Added
set_contact_preferences - Added
set_contact_status - Changed
start_file_upload6 fields changed- removed
Input schema / properties / content_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / content_type / defaultRemoved value: -null - changed
Input schema / properties / content_type / descriptionPrevious value: -"Its MIME type; guessed from the name when left out."New value: +"MIME type; guessed if omitted." - added
Input schema / properties / content_type / typeAdded value: +"string" - changed
Input schema / properties / path / descriptionPrevious value: -"The full path to write to, e.g. \"/reports/q3.xlsx\". An existing\nfile at that path gets a new version."New value: +"Full path to write to." - changed
Input schema / properties / size / descriptionPrevious value: -"The file's size in bytes."New value: +"File size in bytes."
- Added
update_data_type - Added
update_fulcra_settings - Changed
upload_file_chunk2 fields changed- changed
Input schema / properties / data / descriptionPrevious value: -"The chunk, base64-encoded. Every chunk but the last must be a\nmultiple of 256 KiB, and at most 8 MiB."New value: +"The chunk, base64." - changed
Input schema / properties / offset / descriptionPrevious value: -"Where this chunk starts in the file, in bytes; chunks go in\norder. Resending a chunk that already arrived is harmless."New value: +"Chunk start, in bytes."
- Changed
write_file4 fields changed- removed
Input schema / properties / content_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / content_type / defaultRemoved value: -null - added
Input schema / properties / content_type / typeAdded value: +"string" - changed
Output schema / (root)Previous value: -{ - "properties": { - "result": { - "type": "string" - } - }, - "required": [ - "result" - ], - "type": "object", - "x-fastmcp-wrap-result": true -}New value: +null
9 tool updates
v1.2.4- Added
delete_records - Added
leave_share - Added
open_file_manager - Changed
read_file2 fields changed- added
Input schema / properties / as_linkAdded value: +{ + "default": false, + "description": "Instead of the contents, return a link the user opens to\ndownload the file, e.g. a spreadsheet. It works for 10 minutes.", + "type": "boolean" +} - changed
Input schema / properties / include_binary / descriptionPrevious value: -"Return non-UTF-8 files base64-encoded (default false).\nOtherwise binary files are refused with their size."New value: +"Return other binary files base64-encoded (default\nfalse); this uses a lot of context."
- Changed
record_data1 field changed- added
Input schema / properties / record_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "v1 types only. The id (a UUID) to give the record. Leave it\nout and one is generated. To retry a send whose outcome is\nunknown, pass the id from the first attempt: a record sent again\nwith the same id is stored as the same record, not a second one." +}
- Added
send_agent_message - Added
start_file_upload - Added
upload_file_chunk - Changed
write_file8 fields changed- added
Input schema / properties / content / defaultAdded value: +"" - changed
Input schema / properties / content / descriptionPrevious value: -"The text content to write."New value: +"The text to write, or with encoding=\"base64\", the file's bytes\nbase64-encoded (up to 5 MB). For larger files, or files the user\nhas on their computer, use open_file_manager." - added
Input schema / properties / content_type / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / content_type / defaultPrevious value: -"text/plain"New value: +null - changed
Input schema / properties / content_type / descriptionPrevious value: -"Optional MIME type. Defaults to \"text/plain\"; use e.g.\n\"application/json\" when writing JSON."New value: +"Optional MIME type; guessed from the file name when left\nout (e.g. \"application/json\" for .json)." - removed
Input schema / properties / content_type / typeRemoved value: -"string" - added
Input schema / properties / encodingAdded value: +{ + "default": "text", + "description": "\"text\" (default) or \"base64\". \"upload_link\" leaves content\nempty and returns a link to send a file on disk to, e.g. from a\nsandbox: `curl -T <file> <link>` (up to 30 MB).", + "enum": [ + "text", + "base64", + "upload_link" + ], + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "path", - "content" -]New value: +[ + "path" +]
34 tool updates
v1.1.0- Added
annotations_catalog - Added
archive_data_type - Added
create_data_type - Added
create_group - Added
create_share - Added
debug_token_info - Added
delete_file - Added
delete_group - Added
delete_share - Added
get_calendar_events - Added
get_calendars - Added
get_data_catalog - Added
get_data_updates - Added
get_groups - Changed
get_location_at_time13 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / include_afterAdded value: +{ + "default": true, + "description": "Allow the closest sample to be after `time` (default true).", + "type": "boolean" +} - removed
Input schema / properties / reverse_geocode / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - changed
Input schema / properties / reverse_geocode / defaultPrevious value: -falseNew value: +true - added
Input schema / properties / reverse_geocode / descriptionAdded value: +"Include the address of the location (default true)." - removed
Input schema / properties / reverse_geocode / titleRemoved value: -"Reverse Geocode" - added
Input schema / properties / reverse_geocode / typeAdded value: +"boolean" - added
Input schema / properties / time / descriptionAdded value: +"The point in time to locate the user at. Must include tz (ISO8601)." - removed
Input schema / properties / time / titleRemoved value: -"Time" - added
Input schema / properties / window_size / descriptionAdded value: +"Seconds around `time` to search for samples (default 14400)." - removed
Input schema / properties / window_size / titleRemoved value: -"Window Size" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"_WrappedResult"
- Changed
get_location_time_series13 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / change_meters / descriptionAdded value: +"Drop samples fewer than this many meters from the previous one." - removed
Input schema / properties / change_meters / titleRemoved value: -"Change Meters" - added
Input schema / properties / end_time / descriptionAdded value: +"Range end (exclusive). Must include tz (ISO8601)." - removed
Input schema / properties / end_time / titleRemoved value: -"End Time" - added
Input schema / properties / reverse_geocode / descriptionAdded value: +"Include the address of each location (default false)." - removed
Input schema / properties / reverse_geocode / titleRemoved value: -"Reverse Geocode" - added
Input schema / properties / sample_rate / descriptionAdded value: +"Seconds per sample (default 900)." - removed
Input schema / properties / sample_rate / titleRemoved value: -"Sample Rate" - added
Input schema / properties / start_time / descriptionAdded value: +"Range start (inclusive). Must include tz (ISO8601)." - removed
Input schema / properties / start_time / titleRemoved value: -"Start Time" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"_WrappedResult"
- Removed
get_metric_samples - Removed
get_metric_time_series - Removed
get_metrics_catalog - Added
get_records - Added
get_sleep - Removed
get_sleep_cycles - Added
get_time_series - Changed
get_user_info3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"_WrappedResult"
- Changed
get_workouts8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / end_time / descriptionAdded value: +"the ending time of the period. Must include tz (ISO8601)." - removed
Input schema / properties / end_time / titleRemoved value: -"End Time" - added
Input schema / properties / fulcra_useridAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Retrieve data for another Fulcra user (if shared)" +} - added
Input schema / properties / start_time / descriptionAdded value: +"The starting time of the period. Must include tz (ISO8601)." - removed
Input schema / properties / start_time / titleRemoved value: -"Start Time" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"_WrappedResult"
- Added
join_group - Added
leave_group - Added
list_files - Added
list_shares - Added
read_file - Added
record_data - Added
restore_data_type - Added
restore_file - Added
write_file
8 tool updates
- First observed
get_location_at_time - First observed
get_location_time_series - First observed
get_metric_samples - First observed
get_metric_time_series - First observed
get_metrics_catalog - First observed
get_sleep_cycles - First observed
get_user_info - First observed
get_workouts
TDQS
Scored across 48 tools
Core data, file, share, and group tools are mostly distinct, but the agent-contact cluster overlaps heavily across invitations, contact status/identifier, preferences/settings, and panel-opening tools. Several tools sound like they target the same contact workflow, so an agent could easily pick the wrong one.
Tool names are overwhelmingly snake_case verb_noun and readable. Minor deviations appear with open_/get_/prepare_/create_/match_ prefixes, but the convention remains predictable overall.
At 48 tools, the surface is heavy even for a broad personal-data platform. Several UI-oriented or auxiliary tools inflate the set and increase selection burden.
Coverage is broad: data types, records, files, shares, groups, agent communication, and preferences all have lifecycle operations. Some gaps remain, such as record updates and calendar/message mutations, but they are mostly minor.
Maintenance
Related MCP Connectors
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
Let AI agents query data and act across all your business apps via MCP.
Cross-tool persistent memory and context for AI assistants over MCP.
Your memory, everywhere AI goes. Build knowledge once, access it via MCP anywhere.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides access to Oura Ring health data, including sleep, activity, readiness, and stress metrics via the Model Context Protocol. It enables users to query their personal biometric information and daily health summaries through natural language in MCP-compatible clients.1,264 npmMIT
- AlicenseAqualityDmaintenanceExposes real-time health data from the Ultrahuman Ring to AI agents via the Model Context Protocol, providing optimized summaries with trend analysis and actionable insights.7MIT
- AlicenseBqualityDmaintenanceEnables users to query their Oura Ring data (sleep, readiness, activity, heart rate) via natural language through any MCP-compatible LLM.415 npm1MIT
- AlicenseNot gradedqualityBmaintenanceExposes personal health data (recovery, sleep, strain, etc.) as MCP tools for AI agents to query and analyze.5MIT