Machine access
Structured theology, retrievable by machine
Two interfaces over the same record, documented and versioned separately: a REST API for applications and an MCP server for AI agents. Both are public and read-only, return published and provisional records only — never drafts — and carry provenance with every claim.
https://abrahammoses.com/
Every URL in the documentation, the API and the MCP manifest is generated from one setting. The status page checks that it matches the host serving requests.
REST API 1.1 · MCP 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05 · record f79c70d2ef22dde1
Additive changes keep v1; a breaking change would ship as /api/v2, with v1 kept through an announced deprecation period. Every response carries X-Record-Version.
1.1 (2026-10-20, additive): simulation and comparison outcomes carry epistemic_status (supported, partially_supported, support_weakened, not_established, insufficient_evidence, disputed_interpretation) beside the unchanged legacy status; display that, not the legacy value. headline_confidence is deprecated and will be removed in v2.
For AI agents
MCP server
Streamable HTTP transport in stateless JSON mode at https://abrahammoses.com/mcp. Send JSON-RPC 2.0 with POST; responses are application/json. No account, key or session is needed — the server issues no Mcp-Session-Id, which the specification permits — but it implements the full exchange: initialize, tools/list, tools/call, resources and prompts. A GET is answered with 405, as the server sends no unsolicited messages.
The previously published address https://abrahammoses.com/api/public/mcp also accepts MCP over POST, so clients configured with it keep working; a GET there still returns the service manifest.
The record moved to https://abrahammoses.com/. The previous host https://abraham.sagolik.com still serves the MCP server and the REST API directly, without a redirect, so existing configurations keep working. Please update them to the address above.
claude mcp add --transport http abrahammoses https://abrahammoses.com/mcp
{
"mcpServers": {
"abrahammoses": {
"type": "http",
"url": "https://abrahammoses.com/mcp"
}
}
}In claude.ai, add a custom connector with the URL above; no authentication is required.
curl -s https://abrahammoses.com/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"example","version":"1.0"}}}'{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2025-06-18",
"capabilities": {
"tools": {
"listChanged": false
},
"resources": {
"subscribe": false,
"listChanged": false
},
"prompts": {
"listChanged": false
}
},
"serverInfo": {
"name": "abrahammoses",
"title": "AbrahamMoses",
"version": "1.0.0",
"websiteUrl": "https://abrahammoses.com/developers"
},
"instructions": "AbrahamMoses is a structured theological research record. It separates what a text says (textual reports) from how traditions read it (attributed interpretations) and from machine analysis, and it never ranks religions.\n\nUse search_record to find what the record holds on a question or a reference, then get_claim to read a claim with its witnesses, editions, confidence axes and per-tradition
…curl -s https://abrahammoses.com/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'MCP-Protocol-Version: 2025-06-18' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_claim","arguments":{"code":"AM-CLAIM-000184"}}}'{
"object": "claim",
"code": "AM-CLAIM-000184",
"url": "https://abrahammoses.com/claims/AM-CLAIM-000184",
"statement": "Hebrews identifies Jesus as High Priest according to the order of Melchizedek.",
"role": "thesis",
"classification": "textual_proposition",
"classification_label": "Explicit textual proposition",
"topic": "Priesthood",
"cases": [
"priesthood-new-covenant",
"restoration-priesthood-authority"
],
"revision": 2,
"status": "provisional",
"published_at": "2026-10-14T12:00:00Z",
"headline_confidence": "Very high",
"disputed": "No — regarding what Hebrews explicitly states",
"interpretive_divergence": "Begins when determining the ecclesiological implications of the claim.",
"witnesses": [
{
"display": "Hebrews 5:6",
"work": "hebrews",
"locator": "5:6",
"work_title": "Epistle to the Hebrews",
"edition": "Novum Testamentum Graece, 28th edition (Nestle–Aland)"
},
{
"display": "Hebrews 6:20",
"work": "hebrews",
"locator": "6:20",
"work_title": "Epistle to the Hebrews",
"edition": "Novum Testamentum Graece, 28th edition (Nestle–Aland)"
},
{
"display": "Hebrews 7:17",
"work": "hebrews",
"locator": "7:17",
"work_title": "Epistle to the Hebrews",
"edition": "Novum Testamentum Graece, 28th edition (Nestle–Aland)"
}
],
"
…{
"epistemic_summary": {
"supported": 69,
"partially_supported": 1,
"support_weakened": 4,
"not_established": 0,
"set_aside": 0
},
"affected": [
"AM-CLAIM-000189: partially_supported (legacy status: unwarranted)",
"AM-CLAIM-000191: support_weakened (legacy status: weakened)",
"AM-CLAIM-000184: support_weakened (legacy status: weakened)",
"AM-CLAIM-000199: support_weakened (legacy status: weakened)",
"AM-CLAIM-000202: support_weakened (legacy status: weakened)"
]
}Tools
search_record — Search the research record
Find what the AbrahamMoses record holds on a question, a scripture reference (e.g. "Hebrews 7", "Q 3:67") or a topic. Returns the matching research case (if one clearly fits), ranked claims and other records. Nothing is generated: every result is a published record with a code you can open with get_claim. Requests to score or rank whole religions are redirected to analysable questions. Read-only; returns published records only.
{
"type": "object",
"properties": {
"q": {
"description": "A research question, a scripture reference, or terms",
"type": "string",
"minLength": 1,
"maxLength": 500
},
"limit": {
"default": 10,
"type": "integer",
"minimum": 1,
"maximum": 25
}
},
"required": [
"q"
]
}Output schema: published with the tool listing (9 top-level fields). Annotations: read-only, idempotent, closed world.
get_claim — Get a claim
Full record for one claim (AM-CLAIM-…): statement, classification, primary witnesses and the editions cited, evidence, variants, a confidence profile on separate axes (textual, philological, historical, inferential — never combined), per-tradition acceptance, derivations, counter-models, revision history, editorial and machine-involvement disclosure, and a stable citation. Use when you need to quote or rely on a claim. Read-only; returns published records only.
{
"type": "object",
"properties": {
"code": {
"description": "Claim code, e.g. AM-CLAIM-000184",
"type": "string",
"minLength": 1,
"maxLength": 40
},
"revision": {
"description": "Revision number; omit for the current revision",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"code"
]
}Output schema: published with the tool listing (35 top-level fields). Annotations: read-only, idempotent, closed world.
list_claims — List claims
List claims, filtered by topic, classification, role, research case, tradition or publication status. Returns summaries; use get_claim for the full record. Read-only; returns published records only.
{
"type": "object",
"properties": {
"topic": {
"description": "Case-insensitive topic, e.g. Priesthood, Torah, Abraham",
"type": "string",
"maxLength": 100
},
"classification": {
"description": "Claim classification",
"type": "string",
"enum": [
"quotation",
"textual_proposition",
"exegetical_lemma",
"philological_claim",
"historical_claim",
"inference",
"doctrinal_interpretation"
]
},
"role": {
"type": "string",
"enum": [
"thesis",
"lemma",
"parent",
"position"
]
},
"case": {
"description": "Research case slug",
"type": "string",
"maxLength": 100
},
"tradition": {
"description": "Tradition id; matches claims attributed to it or with a recorded stance from it",
"type": "string",
"maxLength": 100
},
"status": {
"type": "string",
"enum": [
"provisional",
"published",
"externally_reviewed",
"withdrawn"
]
},
"limit": {
"default": 50,
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"default": 0,
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
}
}Output schema: published with the tool listing (3 top-level fields). Annotations: read-only, idempotent, closed world.
get_provenance — Get a provenance chain
The reasoning chain behind a claim, in eight steps: finding, claims used, supporting evidence, primary source, covenant relationships, doctrine connections, interpretations and counterviews. Read-only; returns published records only.
{
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 1,
"maxLength": 40
},
"revision": {
"description": "Revision number; omit for the current revision",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"code"
]
}Output schema: published with the tool listing (3 top-level fields). Annotations: read-only, idempotent, closed world.
get_dependencies — Get what a claim rests on
A claim's derivations — each an independent way of arriving at it, with necessary and supporting premises and the reading principles (axioms) it requires — plus everything upstream and downstream of it. Read-only; returns published records only.
{
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 1,
"maxLength": 40
}
},
"required": [
"code"
]
}Output schema: published with the tool listing (7 top-level fields). Annotations: read-only, idempotent, closed world.
simulate_rejection — Simulate rejecting claims or assumptions
Reject one or more claims (AM-CLAIM-…) or reading principles (AM-AX-…), or apply a tradition’s lens, and see what still holds. A conclusion is not established under the selected assumptions only when none of its independent derivations survives; textual reports keep their standing as reports when the reading built on them fails; rival readings are reported on both sides. This is a simulation: the record and its sources are never changed. Use it to test how much a conclusion depends on a disputed assumption. Each outcome carries epistemic_status (supported, partially_supported, support_weakened, not_established, …) alongside the legacy status value; report results in that wording.
{
"type": "object",
"properties": {
"reject_claims": {
"description": "Claim codes to reject, e.g. AM-CLAIM-000186 (array, or comma-separated in a query string)",
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
}
]
},
"reject_axioms": {
"description": "Axiom codes to reject, e.g. AM-AX-002",
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
}
]
},
"lens": {
"description": "Tradition id: rejects every axiom that tradition rejects or sets aside",
"type": "string",
"maxLength": 60
}
}
}Output schema: published with the tool listing (11 top-level fields). Annotations: read-only, idempotent, closed world.
list_research_cases — List research cases
The flagship research cases — Jewish, Christian, Islamic and Latter-day Saint studies — each a contested question with opposing positions and their derivations. Read-only; returns published records only.
{
"type": "object",
"properties": {}
}Output schema: published with the tool listing (1 top-level fields). Annotations: read-only, idempotent, closed world.
get_research_case — Get a research case
One research case: the question, how it is framed and in whose categories, the positions and who holds them, each tradition's response (including where a tradition asks a different question), and known limitations. Read-only; returns published records only.
{
"type": "object",
"properties": {
"slug": {
"description": "Case slug, e.g. torah-permanence",
"type": "string",
"minLength": 1,
"maxLength": 100
}
},
"required": [
"slug"
]
}Output schema: published with the tool listing (15 top-level fields). Annotations: read-only, idempotent, closed world.
compare_traditions — Compare traditions on a research case
Side-by-side responses of each tradition to a research case, with the reading principles each tradition’s lens removes and which positions still stand under it. Marks explicitly where a tradition asks a different question or where comparison is not meaningful.
{
"type": "object",
"properties": {
"case": {
"description": "Case slug",
"type": "string",
"minLength": 1,
"maxLength": 100
}
},
"required": [
"case"
]
}Output schema: published with the tool listing (6 top-level fields). Annotations: read-only, idempotent, closed world.
list_axioms — List reading principles
The tradition axioms — reading principles such as typology, Torah permanence or an open canon — with each tradition's recorded stance and the derivations that use them. Read-only; returns published records only.
{
"type": "object",
"properties": {}
}Output schema: published with the tool listing (1 top-level fields). Annotations: read-only, idempotent, closed world.
list_covenants — List Covenant Map relationships
Covenant relationships, each attributed to the traditions whose reading of covenantal history it belongs to. Filter by tradition family. Read-only; returns published records only.
{
"type": "object",
"properties": {
"family": {
"type": "string",
"enum": [
"jewish",
"christian",
"islamic",
"latter-day-saint",
"scholarly"
]
}
}
}Output schema: published with the tool listing (1 top-level fields). Annotations: read-only, idempotent, closed world.
list_doctrine_connections — List Doctrine Graph connections
Doctrine Graph edges with relationship type, classification, tradition status and evidence. Filter by node (e.g. "abraham") or topic. Read-only; returns published records only.
{
"type": "object",
"properties": {
"node": {
"type": "string",
"maxLength": 100
},
"topic": {
"type": "string",
"maxLength": 100
}
}
}Output schema: published with the tool listing (1 top-level fields). Annotations: read-only, idempotent, closed world.
get_citation — Cite a claim
A stable citation for a claim revision, as text, BibTeX and CSL-JSON. Read-only; returns published records only.
{
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 1,
"maxLength": 40
},
"revision": {
"description": "Revision number; omit for the current revision",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"code"
]
}Output schema: published with the tool listing (6 top-level fields). Annotations: read-only, idempotent, closed world.
get_record_history — Get the record’s revision history
Every published and provisional revision across the record, newest first, with its change note. Read-only; returns published records only.
{
"type": "object",
"properties": {
"limit": {
"default": 25,
"type": "integer",
"minimum": 1,
"maximum": 200
}
}
}Output schema: published with the tool listing (1 top-level fields). Annotations: read-only, idempotent, closed world.
Resources: abrahammoses://cases/{slug}, abrahammoses://claims/{code}, abrahammoses://claims/{code}/provenance, abrahammoses://axioms/{code}, abrahammoses://methodology/dependency-semantics. Prompts: examine_question, challenge_assumption.
Conformance is tested on every build with the official MCP TypeScript SDK client, connecting over HTTP to both endpoints, listing tools, calling them with output-schema validation, reading resources and listing prompts.
For applications
REST API v1
Base URL https://abrahammoses.com/api/v1. JSON responses; no key. The OpenAPI 3.1 document and the JSON Schemas below are generated from the same definitions the responses are tested against.
| Method | Path | Description | Try it |
|---|---|---|---|
| GET | /api/v1 | API index Lists every endpoint with its method, path and documentation link. | / |
| GET | /api/v1/claims | List claims Published and provisional claims, filterable by topic, classification, role, case, tradition and status. | /claims?topic=Priesthood&limit=5 |
| GET | /api/v1/claims/{code} | Get a claim The full record for a claim: witnesses and editions, evidence, variants, confidence axes, acceptance, derivations, counter-models, revisions, editorial and machine-involvement disclosure, citation. | /claims/AM-CLAIM-000184 |
| GET | /api/v1/claims/{code}/revisions | List a claim’s revisions Every public revision, oldest first, with its content hash. Public revisions are immutable; the one status correction (2026-10-20) is listed on /changelog. | /claims/AM-CLAIM-000191/revisions |
| GET | /api/v1/claims/{code}/provenance | Get a provenance chain | /claims/AM-CLAIM-000191/provenance |
| GET | /api/v1/claims/{code}/dependencies | Get what a claim rests on and supports | /claims/AM-CLAIM-000191/dependencies |
| GET | /api/v1/claims/{code}/citation | Cite a claim revision Text, BibTeX and CSL-JSON citations pointing at an immutable revision. | /claims/AM-CLAIM-000184/citation?rev=1 |
| GET | /api/v1/axioms | List reading principles (axioms) | /axioms |
| GET | /api/v1/axioms/{code} | Get a reading principle | /axioms/AM-AX-002 |
| GET | /api/v1/counter-models | List counter-models | /counter-models?targets=AM-CLAIM-000191 |
| GET | /api/v1/counter-models/{code} | Get a counter-model | /counter-models/AM-CM-001 |
| GET | /api/v1/covenants | List Covenant Map relationships | /covenants?family=islamic |
| GET | /api/v1/doctrine | List Doctrine Graph connections | /doctrine?node=abraham |
| GET | /api/v1/traditions | List traditions | /traditions |
| GET | /api/v1/traditions/{id} | Get a tradition and its stances | /traditions/rabbinic-judaism |
| GET | /api/v1/cases | List research cases | /cases |
| GET | /api/v1/cases/{slug} | Get a research case | /cases/torah-permanence |
| GET | /api/v1/cases/{slug}/compare | Compare traditions on a research case Each tradition’s response, the axioms its lens removes, and which positions stand under it. | /cases/ibrahim-heirs-and-revelation/compare |
| GET | /api/v1/simulate | Simulate a rejection Reject claims or axioms (comma-separated), or apply a tradition lens, and see what still holds. Cacheable form of POST /simulate. The record is never changed. | /simulate?reject_axioms=AM-AX-002 |
| POST | /api/v1/simulate | Simulate a rejection (JSON body) | POST /simulate |
| GET | /api/v1/search | Search the record Retrieval over published records. No text is generated. | /search?q=Who%20are%20the%20heirs%20of%20Ibrahim |
| GET | /api/v1/corpus | Corpus coverage Every work the record cites, the edition used, and how often it is cited. | /corpus |
| GET | /api/v1/changelog | Record update history | /changelog?limit=10 |
| GET | /api/v1/export | Export the full public record The complete public record as one JSON document, validated by the Record schema. | /export |
| GET | /api/v1/schema | List JSON Schemas | /schema |
| GET | /api/v1/schema/{name} | Get a JSON Schema (draft 2020-12) | /schema/Claim |
| GET | /api/v1/openapi.json | OpenAPI 3.1 document | /openapi.json |
| GET | /api/v1/status | Service status and self-tests Record integrity, the revision lock, and live self-tests of the REST API and MCP server. | /status |
curl https://abrahammoses.com/api/v1/claims/AM-CLAIM-000184
curl "https://abrahammoses.com/api/v1/claims?topic=Torah&limit=5"
curl "https://abrahammoses.com/api/v1/search?q=Who%20are%20the%20heirs%20of%20Ibrahim"
curl "https://abrahammoses.com/api/v1/simulate?reject_axioms=AM-AX-002"
curl -X POST https://abrahammoses.com/api/v1/simulate -H 'Content-Type: application/json' \
-d '{"reject_claims":["AM-CLAIM-000186"],"lens":"rabbinic-judaism"}'
curl https://abrahammoses.com/api/v1/claims/AM-CLAIM-000191/citation?rev=1
curl https://abrahammoses.com/api/v1/export > abrahammoses-record.jsonconst res = await fetch("https://abrahammoses.com/api/v1/doctrine?node=abraham");
const { total, data } = await res.json();
// data[i]: code, source, source_label, target, target_label, relationship_type,
// description, evidence[], classification, tradition_status, grounded_by[]Schema explorer
Errors, limits and caching
Every error has the same shape — { error: { code, message, status, details?, docs } } — and clients should branch on code.
| Code | HTTP | Meaning |
|---|---|---|
| invalid_parameter | 400 | A query parameter, path segment or body field failed validation. |
| invalid_json | 400 | The request body is not valid JSON. |
| not_found | 404 | No published record has this code, or the route does not exist. |
| method_not_allowed | 405 | The route exists but does not accept this HTTP method. |
| payload_too_large | 413 | The request body exceeds 64 KiB. |
| unauthorized | 401 | The endpoint requires credentials that were not supplied. |
| forbidden | 403 | The supplied credentials do not grant this action. |
| rate_limited | 429 | Too many requests from this client; retry after the indicated delay. |
| internal_error | 500 | An unexpected error. Nothing was changed; the request can be retried. |
- Rate limits: 120 requests per minute per client address, per server instance. Every response carries
RateLimit-Limit,RateLimit-RemainingandRateLimit-Reset; a 429 carriesRetry-After. - Caching: responses carry an
ETagand honourIf-None-Match; shared caches may hold them for 60 seconds. - CORS: any origin may call the API and the MCP server from a browser.
- Legacy endpoints:
/api/public/*keeps the shapes existing clients depend on, with additive fields only. New integrations should use v1 or MCP.