Neotoma
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| resources | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| retrieve_file_urlC | Retrieve a signed URL for accessing a file |
| retrieve_entity_snapshotA | Retrieve the current snapshot of an entity with provenance information. Supports historical snapshots via 'at' parameter. |
| list_observationsC | List all observations for a given entity |
| retrieve_field_provenanceC | Retrieve the provenance chain for a specific field in an entity snapshot |
| create_relationshipA | Create a typed relationship between two entities. relationship_type: PART_OF, CORRECTS, REFERS_TO, SETTLES, DUPLICATE_OF, DEPENDS_ON, SUPERSEDES, or EMBEDS. Use EMBEDS when a container entity (e.g. blog post, document) embeds an asset entity (e.g. image, attachment): source_entity_id = container, target_entity_id = asset. For images/files stored in Neotoma: store the file via store (get source_id), create an image/media entity with source_id, then create_relationship(EMBEDS, post_entity_id, image_entity_id). Optional metadata: caption, order. |
| create_relationshipsC | Create multiple typed relationships between existing entities in one batch |
| list_relationshipsC | List relationships for an entity |
| get_relationship_snapshotA | Get the current snapshot of a specific relationship with provenance |
| retrieve_entitiesA | Use this when you need filtered entity lists (by type, pagination, and optional published/date filters) or lexical/semantic retrieval via |
| list_timeline_eventsA | Query timeline events with filters (type, date range, source). Returns chronological events derived from date fields in sources. |
| retrieve_entity_by_identifierB | Retrieve entity by identifier (name, email, etc.) across entity types or specific type. Falls back to semantic search when keyword match returns no results. |
| retrieve_related_entitiesB | Retrieve entities connected to a given entity via relationships. Supports n-hop traversal. |
| retrieve_graph_neighborhoodA | Retrieve complete graph neighborhood around a node (entity or source): related entities, relationships, sources, and events. |
| storeA | Unified storing for structured, file-backed, or combined payloads in one request. Choose path by source: file- or resource-sourced (attachment/file to preserve) → use file_content+mime_type or file_path; conversation- or tool-sourced (chat or other MCP) → use entities. You may send both entities and file input in the same call. File bytes create a content-addressed sources row (SHA-256 dedup per user); the response includes |
| parse_fileA | Parse local or base64-encoded files into agent-readable text and first-page PDF images without storing anything. Use before store when you need to extract entities from a file. |
| correctA | Create high-priority correction observation to override AI-extracted fields. Corrections always win in snapshot computation. |
| merge_entitiesA | Merge duplicate entities. Rewrites observations from source entity to target entity and marks source as merged. |
| split_entityA | R5 inverse of merge_entities. Re-points a predicate-selected subset of an entity's observations onto a new or pre-existing entity to repair over-merges (typically the pre-v1.2 heuristic name_key:title collapse on session-scoped types). Schema-agnostic predicate — supply any of observed_at_gte, source_id_in, or observation_field_equals. Observation content is never modified; only entity_id FK is re-bound. Idempotent via (user_id, idempotency_key) — reuse with a different predicate returns ERR_IDEMPOTENCY_MISMATCH. Typed relationships remain bound to the source; rebuild them with create_relationship. |
| list_potential_duplicatesA | List candidate duplicate entity pairs for an entity_type. Read-only fuzzy post-hoc detector; never auto-merges. Per-schema thresholds and fields come from the schema's duplicate_detection_threshold and duplicate_detection_fields; callers may override threshold per call. Confirm pairs with the user, then hand off to merge_entities. |
| delete_entityA | Delete an entity. Creates a deletion observation so the entity is excluded from snapshots and queries. Immutable and reversible for audit; use for user-initiated or GDPR-style removal from active use. |
| delete_relationshipA | Delete a relationship. Creates a deletion observation so the relationship is excluded from snapshots and queries. Immutable and reversible for audit. |
| restore_entityA | Restore a deleted entity. Creates a restoration observation (priority 1001) that overrides the deletion. Entity becomes visible in snapshots and queries again. Immutable restoration for audit. |
| restore_relationshipA | Restore a deleted relationship. Creates a restoration observation (priority 1001) that overrides the deletion. Relationship becomes visible in snapshots and queries again. Immutable restoration for audit. |
| get_entity_type_countsA | Return canonical entity counts by entity_type for the authenticated user. Uses the same dashboard stats aggregation behind GET /stats and sorts results by count descending, then entity_type ascending. Use this when the user asks for counts by type, histograms, or sorted totals. This returns row counts, unlike list_entity_types where field_count is schema field width. |
| list_entity_typesA | List available entity types. Without keyword: returns a short summary (entity_type, schema_version, field_count) for all types. field_count here means schema field width, not stored entity row count. With keyword: returns full schema (field_names, field_summary) for matching types; pass summary: true to get summary only. Uses hybrid search when keyword is provided: keyword matching first, then vector semantic search. Use before storing structured data to determine the correct entity_type. |
| analyze_schema_candidatesB | Analyze raw_fragments to identify fields that should be promoted to schema fields. Returns recommendations with confidence scores based on frequency and type consistency. |
| get_schema_recommendationsB | Get schema update recommendations for an entity type from raw_fragments analysis, agent suggestions, or inference. |
| update_schema_incrementalA | Incrementally update a schema by adding new fields from raw_fragments or agent recommendations. Creates new schema version and activates it immediately, so all new data stored after this call will use the updated schema. Optionally migrates existing raw_fragments to observations for historical data backfill. |
| register_schemaC | Register a new schema or schema version. Supports both global and user-specific schemas. |
| create_interpretationA | Create an interpretation row for an existing source from agent-extracted flat entities. Observations produced by this tool are linked to both source_id and interpretation_id. Use |
| list_interpretationsB | List interpretation runs for the authenticated user, optionally filtered by source_id. |
| get_authenticated_userA | Get the authenticated user ID for the current MCP session. Returns the user_id that is automatically used for all authenticated actions. |
| get_session_identityA | Resolve the current session's attribution: trust tier, AAuth / clientInfo fields, active anonymous-write policy, and whether the session is eligible for trusted writes. Safe to call as a preflight health check; does not write any rows. |
| health_check_snapshotsA | Check for stale entity snapshots (snapshots with observation_count=0 but observations exist). Returns health status and count of stale snapshots. |
| list_recent_changesA | List the most recently changed records across core Neotoma tables (entities, sources, observations, interpretations, relationships, timeline_events) for the authenticated user. Returns items ordered by latest activity_at. |
| submit_entityA | Generic submission for entity types with an active submission_config. Creates the primary row plus optional conversation thread and guest_access_token; use submit_issue for GitHub-backed issues. |
| add_entity_messageB | Append a follow-up conversation_message to the thread for a submitted root entity (entity_id). |
| get_entity_submission_statusA | JSON entity snapshot for a submitted entity_id; optional guest_access_token for token-scoped read-back. |
| list_entity_submissionsB | List recent entities of a given entity_type for the authenticated user. |
| sync_entity_submissionsA | Sync external mirrors for submissions (issue → GitHub sync; other types may no-op until providers are added). |
| submit_issueA | Submit an issue to the configured operator Neotoma instance; returns guest_access_token when accepted so callers can use token-scoped get_issue_status / add_issue_message read-back. Callers must provide at least one of reporter_git_sha or reporter_app_version. Deprecated alias: visibility 'advisory' is accepted as 'private' for one minor release and returns _deprecation: "visibility 'advisory' is deprecated; use 'private' instead." |
| add_issue_messageA | Append a message to an issue thread. Provide entity_id or issue_number (issue_number is an integer). Pass guest_access_token when the local issue snapshot does not already carry the operator token. |
| get_issue_statusA | Return issue status and thread messages. Provide entity_id or issue_number (issue_number is an integer). Pass guest_access_token when token-scoped remote read-through is needed. |
| sync_issuesA | Full sync of issues from the configured GitHub repo into local Neotoma. Pulls all issues and their messages, creating/updating local entities. Supports filtering by state, labels, and since date. |
| subscribeA | Create a substrate event subscription (webhook with HMAC delivery, or SSE via GET /events/stream). Requires at least one filter among entity_types, entity_ids, or event_types. Optional sync_peer_id skips webhook delivery when the substrate event carries the same source_peer_id (cross-instance loop prevention). |
| unsubscribeC | Deactivate a subscription by subscription_id. |
| list_subscriptionsA | List the current user's active subscriptions (webhook secrets omitted). |
| get_subscription_statusA | Return one subscription snapshot by subscription_id (webhook secret omitted). |
| add_peerB | Register a Neotoma peer (peer_config) for bidirectional sync: peer_url, entity_types allowlist, shared_secret for POST /sync/webhook verification. |
| remove_peerC | Deactivate a peer by peer_id. |
| list_peersA | List peer_config rows for the current user (secrets redacted). |
| get_peer_statusB | Fetch peer_config by peer_id plus remote_health (/health probe, semver compat vs this server). |
| sync_peerC | Bounded outbound peer sync: POST signed /sync/webhook for observations (requires NEOTOMA_PUBLIC_BASE_URL, NEOTOMA_LOCAL_PEER_ID, peer sync_target_user_id). Optional limit. |
| resolve_sync_conflictA | Stub; use correct on the entity for manual resolution today. |
| npm_check_updateA | Check if a newer npm version is available. Returns updateAvailable, message, suggestedCommand, and when include_release_notes is true optional release_url, release_notes_excerpt, breaking_changes_excerpt, enrichment_error. Call at session start to encourage user to upgrade. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| All Entities | All entities regardless of type (0 total) |
| All Relationships | All relationships regardless of type (0 total) |
| Sources | All sources (0 total) |
| Timeline Widget | Embedded timeline widget for timeline event tool results. |
| Entity Types | All available entity types (66 types) |
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/markmhendrickson/neotoma'
If you have feedback or need assistance with the MCP directory API, please join our Discord server