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.

Canonical host

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.

Versions

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 Code
claude mcp add --transport http abrahammoses https://abrahammoses.com/mcp
Claude Desktop, Cursor, VS Code and other clients (mcp.json)
{
  "mcpServers": {
    "abrahammoses": {
      "type": "http",
      "url": "https://abrahammoses.com/mcp"
    }
  }
}

In claude.ai, add a custom connector with the URL above; no authentication is required.

Initialize with curl
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"}}}'
Response (generated by the server as this page rendered)
{
  "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 
  …
Call a tool
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"}}}'
Response: structuredContent (excerpt)
{
  "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)"
    }
  ],
  "
  …
simulate_rejection { reject_axioms: ['AM-AX-002'] } — epistemic summary
{
  "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.

Input schema
{
  "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.

Input schema
{
  "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.

Input schema
{
  "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.

Input schema
{
  "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.

Input schema
{
  "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.

Input schema
{
  "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.

Input schema
{
  "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.

Input schema
{
  "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.

Input schema
{
  "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.

Input schema
{
  "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.

Input schema
{
  "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.

Input schema
{
  "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.

Input schema
{
  "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.

Input schema
{
  "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.

MethodPathDescriptionTry it
GET/api/v1API index
Lists every endpoint with its method, path and documentation link.
/
GET/api/v1/claimsList 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}/revisionsList 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}/provenanceGet a provenance chain/claims/AM-CLAIM-000191/provenance
GET/api/v1/claims/{code}/dependenciesGet what a claim rests on and supports/claims/AM-CLAIM-000191/dependencies
GET/api/v1/claims/{code}/citationCite a claim revision
Text, BibTeX and CSL-JSON citations pointing at an immutable revision.
/claims/AM-CLAIM-000184/citation?rev=1
GET/api/v1/axiomsList reading principles (axioms)/axioms
GET/api/v1/axioms/{code}Get a reading principle/axioms/AM-AX-002
GET/api/v1/counter-modelsList 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/covenantsList Covenant Map relationships/covenants?family=islamic
GET/api/v1/doctrineList Doctrine Graph connections/doctrine?node=abraham
GET/api/v1/traditionsList traditions/traditions
GET/api/v1/traditions/{id}Get a tradition and its stances/traditions/rabbinic-judaism
GET/api/v1/casesList research cases/cases
GET/api/v1/cases/{slug}Get a research case/cases/torah-permanence
GET/api/v1/cases/{slug}/compareCompare 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/simulateSimulate 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/simulateSimulate a rejection (JSON body)POST /simulate
GET/api/v1/searchSearch the record
Retrieval over published records. No text is generated.
/search?q=Who%20are%20the%20heirs%20of%20Ibrahim
GET/api/v1/corpusCorpus coverage
Every work the record cites, the edition used, and how often it is cited.
/corpus
GET/api/v1/changelogRecord update history/changelog?limit=10
GET/api/v1/exportExport the full public record
The complete public record as one JSON document, validated by the Record schema.
/export
GET/api/v1/schemaList JSON Schemas/schema
GET/api/v1/schema/{name}Get a JSON Schema (draft 2020-12)/schema/Claim
GET/api/v1/openapi.jsonOpenAPI 3.1 document/openapi.json
GET/api/v1/statusService status and self-tests
Record integrity, the revision lock, and live self-tests of the REST API and MCP server.
/status
Examples
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.json
From a browser (CORS is open)
const 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.

CodeHTTPMeaning
invalid_parameter400A query parameter, path segment or body field failed validation.
invalid_json400The request body is not valid JSON.
not_found404No published record has this code, or the route does not exist.
method_not_allowed405The route exists but does not accept this HTTP method.
payload_too_large413The request body exceeds 64 KiB.
unauthorized401The endpoint requires credentials that were not supplied.
forbidden403The supplied credentials do not grant this action.
rate_limited429Too many requests from this client; retry after the indicated delay.
internal_error500An unexpected error. Nothing was changed; the request can be retried.