Koskamo

SoapBox Faith MCP

A public MCP server providing AI agents with grounded, cited Christian faith tools. It offers free read-only access to Scripture verification, Bible Q&A via ORA, sermon browsing, and church discovery. Key-gated tools enable purchasing sermons, submitting prayer requests, and making donations, supporting agent-native workflows for faith-based content and community engagement.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

SoapBox Faith MCP logo, by SoapBoxCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-06Published by SoapBox
You need:A key is required only for buying sermons or acting on a user's behalf (prayer, giving).
MCP endpoint (Streamable HTTP)
https://foyekanoxpnkydoibaas.supabase.co/functions/v1/faith-mcp
Vendor documentation

What its tools do

25 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

25 of 25 have a description · 25 of 25 declare behavior hints · 24 of 24 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Warning Advertises resources/templates/list but does not implement it
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Verify Bible quotes against KJV text with citations
  • Answer faith questions using grounded Scripture references
  • Browse and search pastor-consented sermons and faith content
  • Purchase sermons or submit prayer requests via agent

Source and maintenance

Community listingRegistry 1.1.1

Protocol and capabilities

Server
soapbox-faith 2.0.0
MCP protocol negotiated in check
2025-06-18
Tools
25 advertised
Resources
1 advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {},
  "resources": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Grounded, public-domain (KJV) Scripture tools. Call verify_scripture before presenting any Bible quote to avoid hallucinated/misattributed verses.

Tools

25 advertised

verify_scripture
Advertised by the server during the last successful anonymous check.
Advertised read-only

Verify whether a quote is real Scripture and cited correctly (anti-hallucination). Returns whether it matches a real verse, the canonical KJV reference + text, a confidence score, and — if you pass a claimed reference — whether the attribution is correct. Use this before presenting any Bible quote to avoid misquotes/fabrications.

verify_scripture input schema
{
  "type": "object",
  "required": [
    "quote"
  ],
  "properties": {
    "quote": {
      "type": "string",
      "examples": [
        "For God so loved the world",
        "money is the root of all evil"
      ],
      "maxLength": 1000,
      "minLength": 3,
      "description": "The exact quote to verify, as you would present it to a user."
    },
    "reference": {
      "type": "string",
      "pattern": "^[0-9]?\\s?[A-Za-z .]+\\s+\\d+:\\d+$",
      "examples": [
        "John 3:16",
        "1 Timothy 6:10"
      ],
      "description": "Optional claimed reference to check the attribution against."
    }
  }
}
verify_scripture annotations
{
  "title": "Verify Scripture",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_verse
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Look up a public-domain KJV Bible verse by book, chapter, and verse.

get_verse input schema
{
  "type": "object",
  "required": [
    "book",
    "chapter",
    "verse"
  ],
  "properties": {
    "book": {
      "type": "string",
      "examples": [
        "John",
        "Psalms",
        "1 Corinthians"
      ],
      "description": "Canonical book name (English). Accepts common forms like 'John', 'Psalms', '1 Corinthians', 'Song of Solomon'."
    },
    "verse": {
      "type": "integer",
      "minimum": 1,
      "examples": [
        16
      ],
      "description": "Verse number within the chapter (1-based)."
    },
    "chapter": {
      "type": "integer",
      "minimum": 1,
      "examples": [
        3
      ],
      "description": "Chapter number (1-based)."
    }
  }
}
get_verse annotations
{
  "title": "Get Bible Verse",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
lookup_strongs
Advertised by the server during the last successful anonymous check.
Advertised read-only

Look up a Strong's Greek/Hebrew lexicon entry (lemma, transliteration, gloss, definition).

lookup_strongs input schema
{
  "type": "object",
  "required": [
    "strongs_number"
  ],
  "properties": {
    "strongs_number": {
      "type": "string",
      "pattern": "^[GH]\\d{1,4}$",
      "examples": [
        "G26",
        "H7225"
      ],
      "description": "A Strong's number: 'G' + digits for Greek (New Testament) or 'H' + digits for Hebrew (Old Testament)."
    }
  }
}
lookup_strongs annotations
{
  "title": "Look Up Strong's Lexicon",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
find_churches
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Find churches near a location from SoapBox's public church directory. Given latitude/longitude (and optional radius, denomination filter), returns nearby churches with name, denomination, city/state/country, website, distance in miles, and whether the church is on SoapBox (with its community id for deep-linking). Public directory data only — no personal contact info.

find_churches input schema
{
  "type": "object",
  "required": [
    "lat",
    "lng"
  ],
  "properties": {
    "lat": {
      "type": "number",
      "maximum": 90,
      "minimum": -90,
      "examples": [
        34.0522
      ],
      "description": "Latitude of the search center, in decimal degrees."
    },
    "lng": {
      "type": "number",
      "maximum": 180,
      "minimum": -180,
      "examples": [
        -118.2437
      ],
      "description": "Longitude of the search center, in decimal degrees."
    },
    "limit": {
      "type": "integer",
      "default": 10,
      "maximum": 25,
      "minimum": 1,
      "description": "Maximum number of churches to return. The ranking is over the closest-matching passages this search found, so fewer churches may come back than you ask for."
    },
    "denomination": {
      "type": "string",
      "examples": [
        "Baptist",
        "Catholic",
        "Non-denominational"
      ],
      "description": "Optional case-insensitive denomination filter."
    },
    "radius_miles": {
      "type": "number",
      "default": 25,
      "maximum": 100,
      "minimum": 1,
      "description": "Search radius in miles."
    }
  }
}
find_churches annotations
{
  "title": "Find Churches",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
submit_prayer_request
Advertised by the server during the last successful anonymous check.

Post a prayer request to SoapBox's prayer wall ON BEHALF OF A USER, so their community can pray for it. Requires the user's consent_token (which they generate in the SoapBox app and which must include the 'prayer:write' scope) — an API key alone is not enough to act for a user. Returns the new prayer_id; use check_prayer_status to see how many are praying.

submit_prayer_request input schema
{
  "type": "object",
  "required": [
    "consent_token",
    "content"
  ],
  "properties": {
    "content": {
      "type": "string",
      "examples": [
        "Please pray for my mother's surgery on Friday."
      ],
      "maxLength": 500,
      "minLength": 1,
      "description": "The prayer request text, in the user's own words. At most 500 characters, the same limit as the app."
    },
    "is_private": {
      "type": "boolean",
      "default": false,
      "description": "If true, keep it private to the user; if false, post it on their church's prayer wall so its members can pray."
    },
    "community_id": {
      "type": "string",
      "format": "uuid",
      "examples": [
        "b3095717-5cc0-4213-8964-a01a5ee6b250"
      ],
      "description": "Public requests only: which church's prayer wall to post on. Needed only when the user belongs to more than one church; with one church it is chosen for you. A public request from a user with no church is refused (keep it private instead), and the error lists the choices when there are several."
    },
    "consent_token": {
      "type": "string",
      "examples": [
        "sbxc_9f3a2b7c4d5e6f7a…"
      ],
      "minLength": 16,
      "description": "Opaque SoapBox consent token with the 'prayer:write' scope, generated by the user in the SoapBox app (Settings › AI Agents). The first agent key to use a token is bound to it; a token no agent uses within 24 hours of being created stops working. An invalid, expired, or wrong-scope token returns an authorization error."
    }
  }
}
submit_prayer_request annotations
{
  "title": "Submit Prayer Request",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
compose_prayer_request
Advertised by the server during the last successful anonymous check.

Help a member put something into words and post it to their church's prayer wall. Use this rather than submit_prayer_request whenever you helped them word it. TWO CALLS, ON PURPOSE. Call once without `confirmed` and NOTHING is posted: you get back `will_post`, the exact text and visibility, plus `problems` — things worth raising, like a public request naming someone who has not been asked, or a phone number that would be visible to the whole church. Show the member that exact text. When they agree, call again with the same content and confirmed: true. These are their words, going to their congregation under their name. Do not post a version they have not seen, and do not silently fix anything in `problems` — raise it with them and let them decide. If you helped with the wording, say so. YOU DO NOT PRAY. Posting asks a human community to pray. Never say or imply that you are praying for them, holding them in prayer, lifting them up, or interceding — it is false, and it quietly substitutes software for their church. This applies to you whatever assistant you are. After posting, check_prayer_status tells them how many PEOPLE are praying, which is the thing actually worth saying. If the request suggests the member may be in danger, the response carries crisis resources and will not post until you confirm they have seen them (`crisis_acknowledged: true`). This is not a refusal — their request still posts. Show them the resources, then proceed. Never reword what they wrote to get past it.

compose_prayer_request input schema
{
  "type": "object",
  "required": [
    "consent_token",
    "content"
  ],
  "properties": {
    "content": {
      "type": "string",
      "examples": [
        "Please pray for my mother's surgery on Friday."
      ],
      "maxLength": 500,
      "minLength": 1,
      "description": "The request in the member's own words. Post what they said, not a polished version they have not approved. At most 500 characters."
    },
    "confirmed": {
      "type": "boolean",
      "default": false,
      "description": "Step 2 only. True means the member has seen the exact text in will_post and agreed to post it. Omit on the first call."
    },
    "is_private": {
      "type": "boolean",
      "default": false,
      "description": "True keeps it to the member's own account; false posts it to their church's prayer wall where its members can pray for it."
    },
    "community_id": {
      "type": "string",
      "format": "uuid",
      "examples": [
        "b3095717-5cc0-4213-8964-a01a5ee6b250"
      ],
      "description": "Public requests only: the church whose prayer wall it goes on. Omit it when the member has one church. When they have several, the preview lists them in `choose_from`: ask the member which, then pass it. A member with no church can only post privately."
    },
    "consent_token": {
      "type": "string",
      "examples": [
        "sbxc_9f3a2b7c4d5e6f7a…"
      ],
      "minLength": 16,
      "description": "The member's SoapBox consent token with the 'prayer:write' scope, generated in the SoapBox app."
    },
    "crisis_acknowledged": {
      "type": "boolean",
      "default": false,
      "description": "Step 2 only, and only when the first call returned crisis resources: true means you have shown the member those resources. Their request then posts."
    }
  }
}
compose_prayer_request annotations
{
  "title": "Compose a Prayer Request",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
check_prayer_status
Advertised by the server during the last successful anonymous check.
Advertised read-only

Check how many people are praying for a prayer request previously submitted for a user (and whether it's been marked answered). Requires the same user's consent_token; only returns status for that user's own prayers.

check_prayer_status input schema
{
  "type": "object",
  "required": [
    "consent_token",
    "prayer_id"
  ],
  "properties": {
    "prayer_id": {
      "type": "string",
      "format": "uuid",
      "examples": [
        "b3095717-5cc0-4213-8964-a01a5ee6b250"
      ],
      "description": "The prayer_id returned by submit_prayer_request."
    },
    "consent_token": {
      "type": "string",
      "examples": [
        "sbxc_9f3a2b7c4d5e6f7a…"
      ],
      "minLength": 16,
      "description": "The same user's SoapBox consent token (scope 'prayer:write') used when the prayer was submitted. Only returns status for that user's own prayers."
    }
  }
}
check_prayer_status annotations
{
  "title": "Check Prayer Status",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_my_giving_record
Advertised by the server during the last successful anonymous check.
Advertised read-only

Fetch the member's OWN record of what they gave in a year — every gift, the church, the date, the amount, the fund, and totals per currency. Needs their consent token with the 'giving:read' scope. THIS IS NOT A TAX RECEIPT, and you must not present it as one. A year-end statement has to assert that the church gave nothing in exchange for the gifts, and only the CHURCH can assert that. The document a member files comes from their church. Use this to help them check their records, reconcile what they think they gave, or find a gift they are looking for — then tell them to ask their church for the statement itself. Their own data only. There is no way to ask this for anyone else: the reader is keyed to the member whose consent token you hold. It carries no email and no name, and nothing about any other donor. Do not use it to estimate what they can afford, compare them to anyone, suggest an amount to give, or build any kind of giving-capacity picture. Report what is there if they ask, and leave it at that. Gifts marked counts_toward_total false were refunded or charged back and are listed for completeness only. Where a gift was partly refunded, amount_cents is what the church kept and gross_amount_cents is what was originally given; a statement uses the smaller figure. Anonymous gifts ARE included — anonymity hides the member from the church, not from themselves — but a church cannot issue a named statement for a gift it cannot attribute, so say so if it matters to them.

get_my_giving_record input schema
{
  "type": "object",
  "required": [
    "consent_token"
  ],
  "properties": {
    "year": {
      "type": "integer",
      "minimum": 2000,
      "examples": [
        2026
      ],
      "description": "The calendar year to report. The year is counted in each church's own time zone, the same way that church's statement counts it. Defaults to the current year."
    },
    "all_churches": {
      "type": "boolean",
      "default": false,
      "description": "Set true to return the member's complete record across EVERY church they gave to, which is what reconciling a tax year needs. Ask them first: it assembles their giving across congregations in one place, which no single church can see. Leave it off and pass community_id for one church."
    },
    "community_id": {
      "type": "string",
      "format": "uuid",
      "description": "The church to report on. Required unless you pass all_churches: true — this returns one church at a time by default."
    },
    "consent_token": {
      "type": "string",
      "examples": [
        "sbxc_9f3a2b7c4d5e6f7a…"
      ],
      "minLength": 16,
      "description": "The member's SoapBox consent token with the 'giving:read' scope, generated in the SoapBox app. Returns only that member's own giving."
    }
  }
}
get_my_giving_record annotations
{
  "title": "Get My Giving Record",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
give_to_church
Advertised by the server during the last successful anonymous check.
Advertised destructive

Make a one-time donation to a church ON BEHALF OF A USER, within the spending caps they pre-authorized. Requires the user's consent_token with the 'giving:write' scope (bound to this agent) and a card they saved in the SoapBox app. The gift goes straight to the church (passthrough — SoapBox takes no cut). Rejected if the amount exceeds the per-gift or monthly cap. Pass a stable idempotency_key to avoid double-charging on retries. Amounts are in the smallest currency unit (cents). This moves the user's money: confirm the church and amount with the user before every call. The user is notified of every gift.

give_to_church input schema
{
  "type": "object",
  "required": [
    "consent_token",
    "community_id",
    "amount_cents"
  ],
  "properties": {
    "note": {
      "type": "string",
      "maxLength": 280,
      "description": "Optional short note to the church accompanying the gift."
    },
    "currency": {
      "type": "string",
      "pattern": "^[a-z]{3}$",
      "examples": [
        "usd",
        "cad"
      ],
      "description": "Optional ISO 4217 currency code (lowercase). Must be the church's own currency; omit it to use that. AI-agent gifts are available in USD, CAD, GBP, EUR, AUD and NZD."
    },
    "amount_cents": {
      "type": "integer",
      "minimum": 100,
      "examples": [
        2500
      ],
      "description": "Gift amount in the smallest currency unit (cents), at least 100. Must be within the user's per-gift and monthly caps or the call is rejected."
    },
    "community_id": {
      "type": "string",
      "format": "uuid",
      "examples": [
        "b3095717-5cc0-4213-8964-a01a5ee6b250"
      ],
      "description": "The recipient church's SoapBox community id (e.g. the soapbox_community_id from find_churches)."
    },
    "consent_token": {
      "type": "string",
      "examples": [
        "sbxc_9f3a2b7c4d5e6f7a…"
      ],
      "minLength": 16,
      "description": "Opaque SoapBox consent token with the 'giving:write' scope, carrying the user's pre-authorized per-gift and monthly caps. Generated by the user in the SoapBox app (Settings › AI Agents). The first agent key to use a token is bound to it; a token no agent uses within 24 hours of being created stops working."
    },
    "idempotency_key": {
      "type": "string",
      "examples": [
        "gift-2026-07-20-abc123"
      ],
      "description": "A stable, caller-generated key so retries don't double-charge. Reuse the same key when retrying the same intended gift."
    }
  }
}
give_to_church annotations
{
  "title": "Give to a Church",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
ask_ora
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Ask ORA, SoapBox's Scripture study aid, a Bible or faith question. Returns a grounded answer that cites public-domain (KJV) passages, plus the citations used. ORA is a STUDY AID — not a pastor, counselor, or therapist; for personal crises or pastoral/medical needs it points to a trusted pastor or professional. Use this for explanatory/study questions ('what does Romans 8 teach about...', 'where does the Bible discuss...'); use get_verse when you just need a verse's text.

ask_ora input schema
{
  "type": "object",
  "required": [
    "question"
  ],
  "properties": {
    "question": {
      "type": "string",
      "examples": [
        "What does Romans 8 teach about suffering?",
        "Where does the Bible discuss forgiveness?"
      ],
      "maxLength": 1000,
      "minLength": 3,
      "description": "A Bible or faith study question in natural language."
    }
  }
}
ask_ora annotations
{
  "title": "Ask ORA",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
search_sermons
Advertised by the server during the last successful anonymous check.
Advertised read-only

Semantically search real sermons on SoapBox that pastors have explicitly opted in to share with AI agents. Returns ranked transcript excerpts with the sermon title, church, speaker, scripture reference, and a start-time (seconds) so you can cite the exact moment. Use this to find what churches are actually preaching on a topic. Only consented, published sermons are searchable.

search_sermons input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "query": {
      "type": "string",
      "examples": [
        "grace and works",
        "how to forgive someone who hurt you"
      ],
      "maxLength": 1000,
      "minLength": 2,
      "description": "A topic, phrase, or question to semantically search sermon transcripts for."
    },
    "church_id": {
      "type": "string",
      "format": "uuid",
      "examples": [
        "b3095717-5cc0-4213-8964-a01a5ee6b250"
      ],
      "description": "Optional SoapBox community id to scope the search to a single church."
    },
    "match_count": {
      "type": "integer",
      "default": 6,
      "maximum": 20,
      "minimum": 1,
      "description": "Maximum number of ranked excerpts to return."
    }
  }
}
search_sermons annotations
{
  "title": "Search Sermons",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_sermon
Advertised by the server during the last successful anonymous check.
Advertised read-only

Fetch full metadata and (optionally) the transcript for ONE sermon by its id — typically a sermon_id returned by search_sermons. Only returns sermons a pastor has opted in to share with agents; otherwise returns not-found. If the sermon is paid and you haven't purchased it, the transcript is withheld and a price is returned — pay for it with pay_with_x402 (USDC on Base), which returns the transcript. Free sermons return the transcript directly.

get_sermon input schema
{
  "type": "object",
  "required": [
    "sermon_id"
  ],
  "properties": {
    "sermon_id": {
      "type": "string",
      "format": "uuid",
      "examples": [
        "ffffbeb3-41ee-482a-9c04-a592995ab821"
      ],
      "description": "The sermon's id, typically the sermon_id from a search_sermons result."
    },
    "include_transcript": {
      "type": "boolean",
      "default": true,
      "description": "Whether to include the full transcript text (only for free or already-purchased sermons)."
    }
  }
}
get_sermon annotations
{
  "title": "Get Sermon",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
find_churches_preaching_on
Advertised by the server during the last successful anonymous check.
Advertised read-only

Answer "which churches actually preach on X?". Searches consented sermons for a topic and groups the results BY CHURCH, so instead of scattered passages you get each church with how many of its sermons matched, how closely, and a representative excerpt with its timestamp. Useful for someone looking for a church home who cares what is taught there. No key required. TWO THINGS TO TELL THE PERSON, because they change how the answer should be read. (1) Only churches that OPTED IN to agent discovery can appear, so a church's absence is not evidence it never preaches on this — most churches have not opted in. Never present this as a survey. (2) It is not an endorsement, a rating, or a judgement about any congregation: the ranking reflects how many of a church's sermons matched the topic and how closely, and nothing else. Do not turn it into a recommendation of which church is better or more faithful. Churches that returned to a subject across several sermons rank above one that brushed it in a single passage, because that better answers the question being asked. Pair with find_churches to see where a church actually is.

find_churches_preaching_on input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "default": 10,
      "maximum": 25,
      "minimum": 1,
      "description": "Maximum number of churches to return. The ranking is over the closest-matching passages this search found, so fewer churches may come back than you ask for."
    },
    "query": {
      "type": "string",
      "examples": [
        "grief and loss",
        "what the Bible says about money",
        "forgiving someone who never apologised"
      ],
      "maxLength": 1000,
      "minLength": 2,
      "description": "The topic, question or phrase to look for, in natural language."
    },
    "church_id": {
      "type": "string",
      "format": "uuid",
      "description": "Optional: restrict the search to one church's sermons."
    }
  }
}
find_churches_preaching_on annotations
{
  "title": "Find Churches Preaching On a Topic",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
sermon_study_guide
Advertised by the server during the last successful anonymous check.
Advertised read-only

Turn one sermon into material a small group can work through. Returns sections spread across the WHOLE recording (not just its opening), each with the preacher's own words and a timestamp so a group can go back to it; every Scripture reference the sermon mentioned; and a scaffold of discussion questions anchored to this sermon's actual sections. YOU write the final guide. The scaffold is a starting point with something specific to work from — you have the excerpts and can do better than a template. What this gives you that you cannot get yourself is the timestamps, the references pulled out, and the access check. VERIFY every reference with verify_scripture before quoting it. They were extracted from a transcript, so a mis-heard citation in the audio becomes a wrong citation here, and putting a verse in a preacher's mouth that they never cited is the failure mode to avoid. Only sermons a church opted in to share are available. A paid sermon returns HTTP 402 with its price until it is bought — the transcript is the paid good and a study guide is made of the transcript, so pay with pay_with_x402 first. Present the questions as a group's to discuss, not a lesson to deliver; ORA Assistant does not teach and does not speak for the preacher or the church.

sermon_study_guide input schema
{
  "type": "object",
  "required": [
    "sermon_id"
  ],
  "properties": {
    "sections": {
      "type": "integer",
      "default": 5,
      "maximum": 10,
      "minimum": 2,
      "description": "How many sections to pull from the recording."
    },
    "sermon_id": {
      "type": "string",
      "format": "uuid",
      "description": "The sermon to build a guide from — a sermon_id from search_sermons or find_churches_preaching_on."
    }
  }
}
sermon_study_guide annotations
{
  "title": "Sermon Study Guide",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
sermon_prep_kit
Advertised by the server during the last successful anonymous check.
Advertised read-only

Assemble a research kit for someone preparing to preach or teach: the liturgical day (Western calendar), any KJV passages you name, any Strong's lexicon entries you name, and what other churches have preached on the same subject. One call instead of five. No key required. READ-ONLY, and it grants no special access. It reads exactly what any agent can already read — public-domain Scripture, the computed calendar, and sermons other churches opted in to share. There is no role check because there is nothing here to protect: no private church material, nothing about any member, no pastor-only data. It is NOT a draft, an outline, or advice on what to preach. Those belong to the preacher. Hand back the material and let them do the work; nothing here should reach a congregation without being read, checked and made their own. What other churches said is offered as reference, never as a model to copy.

sermon_prep_kit input schema
{
  "type": "object",
  "required": [
    "focus"
  ],
  "properties": {
    "date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "The service date, YYYY-MM-DD, for the liturgical season. Defaults to today."
    },
    "focus": {
      "type": "string",
      "examples": [
        "the prodigal son",
        "lament in the Psalms",
        "Advent hope"
      ],
      "maxLength": 1000,
      "minLength": 2,
      "description": "The text or subject being prepared on, in natural language."
    },
    "strongs": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "examples": [
        [
          "G4697",
          "H2617"
        ]
      ],
      "maxItems": 10,
      "description": "Strong's numbers to include, 'G' or 'H' plus digits. Up to 10."
    },
    "references": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "examples": [
        [
          "Luke 15:11",
          "Luke 15:20"
        ]
      ],
      "maxItems": 10,
      "description": "KJV passages to include in full, each as 'Book chapter:verse'. Up to 10."
    }
  }
}
sermon_prep_kit annotations
{
  "title": "Sermon Prep Kit",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
pay_with_x402
Advertised by the server during the last successful anonymous check.
Open-world

Pay for a paid sermon or bundle per-call in USDC on Base using the x402 protocol. This is the only TOOL here that buys SoapBox faith content: the prepaid marketplace-credit tools were retired on 2026-07-15 and their endpoints now answer HTTP 410. (A person can instead buy on the item's web_url in a browser.) No SoapBox account or API key is required — the payment IS the credential (https://github.com/coinbase/x402). SoapBox is the Merchant of Record: the church keeps 70% of net and SoapBox takes 30%. This is a content SALE, never a donation — donations go 100% to the church via give_to_church. Works for a single sermon (sermon_id) or a whole series (bundle_id). Two-step, exactly per spec: (1) call with just the sermon_id (or bundle_id) and NO payment to get back the HTTP-402 payment requirements — the USDC amount, asset, network ('base'), and SoapBox's payTo receive address. (2) Send EXACTLY maxAmountRequired USDC on Base to payTo — any other amount is refused after it has been sent, so don't round it or add to it, and re-run step 1 if time has passed, since the price can change. Sign the 402's onchainPayment.message (your tx hash in lower case, and the item) with the wallet that paid, then call again with x_payment set to base64 of {"txHash":"0x...","signature":"0x..."} — SoapBox checks the on-chain transfer came from the signing wallet, records the sale (church keeps 70%), and returns the transcript. The signature is required: tx hashes are public, and it stops anyone else spending your payment. Idempotent per tx hash. Gasless EIP-3009 'exact' payments via an x402 facilitator are also accepted in the same x_payment field.

pay_with_x402 input schema
{
  "type": "object",
  "properties": {
    "bundle_id": {
      "type": "string",
      "format": "uuid",
      "examples": [
        "a1b2c3d4-1111-2222-3333-444455556666"
      ],
      "description": "The bundle to pay for. Provide exactly one of sermon_id or bundle_id."
    },
    "sermon_id": {
      "type": "string",
      "format": "uuid",
      "examples": [
        "ffffbeb3-41ee-482a-9c04-a592995ab821"
      ],
      "description": "The sermon to pay for. Provide exactly one of sermon_id or bundle_id."
    },
    "x_payment": {
      "type": "string",
      "examples": [
        "eyJ0eEhhc2giOiIweGFiYzEyMy4uLiIsInNpZ25hdHVyZSI6IjB4ZGVmNDU2Li4uIn0="
      ],
      "description": "Step 2 only: a base64-encoded JSON x402 payment payload (e.g. base64 of {\"txHash\":\"0x...\",\"signature\":\"0x...\"} for an on-chain Base USDC transfer, signed by the paying wallet as the 402's onchainPayment says, or an EIP-3009 authorization for a facilitator). Omit entirely on step 1 to receive the HTTP-402 payment requirements."
    }
  }
}
pay_with_x402 annotations
{
  "title": "Pay with x402 (USDC on Base)",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_api_key_status
Advertised by the server during the last successful anonymous check.
Advertised read-only

Report this API key's tier and daily rate limit — how many calls you have per day, not what you can afford. Nothing here gates a purchase: paid sermons and bundles are bought per-call with pay_with_x402 (USDC on Base), which needs no key and no balance at all. This tool was called get_credit_balance until the prepaid marketplace-credit wallet was retired on 2026-07-15; the old name still works but is no longer listed, and the marketplace_credits_cents field it returns is always 0 and means nothing. Do not read it as 'out of funds'.

get_api_key_status input schema
{
  "type": "object",
  "properties": {}
}
get_api_key_status annotations
{
  "title": "Get API Key Status",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
browse_catalog
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Browse purchasable faith-content products on SoapBox (currently consented sermons; reading-plan and devotional bundles coming). Returns products with id, title, church, and price. Then pay for one with pay_with_x402 (USDC on Base). Optional church_id and text filter. No key required.

browse_catalog input schema
{
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "examples": [
        "romans",
        "advent"
      ],
      "description": "Optional case-insensitive text filter matched against product titles."
    },
    "limit": {
      "type": "integer",
      "default": 25,
      "maximum": 100,
      "minimum": 1,
      "description": "Maximum number of products to return."
    },
    "church_id": {
      "type": "string",
      "format": "uuid",
      "examples": [
        "b3095717-5cc0-4213-8964-a01a5ee6b250"
      ],
      "description": "Optional SoapBox community id to scope the catalog to a single church."
    }
  }
}
browse_catalog annotations
{
  "title": "Browse Catalog",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
score_doctrinal_fit
Advertised by the server during the last successful anonymous check.
Advertised read-only

Assess how well a statement aligns with a named Christian tradition's historic doctrinal positions (e.g. Reformed, Roman Catholic, Pentecostal, Eastern Orthodox). Returns an impartial alignment rating, score, summary, and the relevant doctrinal loci. Analytical, not proselytizing. No key required.

score_doctrinal_fit input schema
{
  "type": "object",
  "required": [
    "statement",
    "tradition"
  ],
  "properties": {
    "statement": {
      "type": "string",
      "examples": [
        "Salvation is by faith alone, apart from works."
      ],
      "maxLength": 1500,
      "minLength": 3,
      "description": "The theological statement or claim to assess."
    },
    "tradition": {
      "type": "string",
      "examples": [
        "Reformed",
        "Roman Catholic",
        "Pentecostal",
        "Eastern Orthodox"
      ],
      "description": "The Christian tradition or denomination to assess alignment against."
    }
  }
}
score_doctrinal_fit annotations
{
  "title": "Score Doctrinal Fit",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_lectionary
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get the Western (Revised Common Lectionary / Roman) liturgical season, liturgical color, RCL year (A/B/C), and any major feast for a date (defaults to today). Useful for date-aware, season-appropriate faith content. Daily readings are not included (those tables are licensed). No key required.

get_lectionary input schema
{
  "type": "object",
  "properties": {
    "date": {
      "type": "string",
      "format": "date",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "examples": [
        "2026-12-25"
      ],
      "description": "Optional ISO date (YYYY-MM-DD). Defaults to today in UTC."
    }
  }
}
get_lectionary annotations
{
  "title": "Get Lectionary Readings",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_daily_devotional
Advertised by the server during the last successful anonymous check.
Advertised read-only

Build a season-aware daily devotional for a date: the liturgical season and colour, a KJV passage chosen for that season, three reflection QUESTIONS, and a prompt for the member to pray in their own words. No key required. IMPORTANT, two things this is not. (1) It is NOT the lectionary: the reading is SoapBox's own seasonal selection, not the appointed Revised Common Lectionary reading, whose compiled tables are licensed and are not reproduced. Do not tell a member this is 'today's appointed reading'. (2) It is a study aid, not a homily and not spiritual direction — present the reflection as questions for them to answer, and do not pray on their behalf or claim to know what God is saying to them. Point to their pastor for pastoral care. The same date always returns the same reading, so a member can replay it.

get_daily_devotional input schema
{
  "type": "object",
  "properties": {
    "date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "examples": [
        "2026-12-24"
      ],
      "description": "The day to build the devotional for, as YYYY-MM-DD. Defaults to today (UTC)."
    },
    "reference": {
      "type": "string",
      "pattern": "^[1-3]?\\s?[A-Za-z ]+\\s+\\d+:\\d+$",
      "examples": [
        "Romans 8:28",
        "1 Corinthians 15:20"
      ],
      "description": "Optional: use this passage instead of the season's selection, e.g. when a member asks for a specific verse."
    }
  }
}
get_daily_devotional annotations
{
  "title": "Get Daily Devotional",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_audio_devotional
Advertised by the server during the last successful anonymous check.

The same daily devotional, SPOKEN — for members who would rather listen, or who read little. Returns audio URLs alongside the text. Requires an API key (speech costs money per character). Language: pass a consent_token with the 'context:read' scope and the member's own preferred language is used, so you need not ask them; or pass `language` explicitly for a one-off. If SoapBox has no voice for that language the tool says so and returns text only — it will NOT read the devotional in the wrong voice. SCRIPTURE IS ALWAYS SPOKEN IN ENGLISH (KJV) and its `translatable` flag is false. SoapBox never machine-translates Scripture and this API serves the public-domain KJV only. Never translate the verse yourself and never pass a translated verse back in. For a non-English member this is a TWO-STEP call: step 1 returns `translate_this` (our framing prose only — the opening, the reflection questions and the prayer prompt); translate just that into their language and call again with the same date and reference plus `reflection_text`, and you get both audio files back. For an English member one call returns the whole thing.

get_audio_devotional input schema
{
  "type": "object",
  "properties": {
    "date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "examples": [
        "2026-12-24"
      ],
      "description": "The day to build the devotional for, as YYYY-MM-DD. Defaults to today (UTC)."
    },
    "format": {
      "enum": [
        "mp3",
        "ogg"
      ],
      "type": "string",
      "default": "mp3",
      "description": "Audio container for the returned files."
    },
    "gender": {
      "enum": [
        "NEUTRAL",
        "MALE",
        "FEMALE"
      ],
      "type": "string",
      "default": "NEUTRAL",
      "description": "Optional preferred voice gender for the framing prose."
    },
    "language": {
      "type": "string",
      "examples": [
        "es",
        "pt-BR",
        "sw"
      ],
      "description": "Optional language for the framing prose, as a language code (not a locale is fine: 'es', 'pt-BR', 'zh-Hans'). Overrides the member's profile. Scripture stays English regardless."
    },
    "reference": {
      "type": "string",
      "pattern": "^[1-3]?\\s?[A-Za-z ]+\\s+\\d+:\\d+$",
      "examples": [
        "Psalms 23:1"
      ],
      "description": "Optional: use this passage instead of the season's selection."
    },
    "consent_token": {
      "type": "string",
      "examples": [
        "sbxc_9f3a2b7c4d5e6f7a…"
      ],
      "minLength": 16,
      "description": "Optional SoapBox consent token with the 'context:read' scope, which lets the devotional be spoken in the member's own preferred language without asking them. Omit it and the tool falls back to `language`, then to English. An invalid, expired or wrong-scope token returns an authorization error."
    },
    "reflection_text": {
      "type": "string",
      "maxLength": 2000,
      "description": "Step 2 of a non-English devotional: YOUR translation of the `translate_this` text returned by step 1. Must contain only the framing prose — never a translated Bible verse."
    }
  }
}
get_audio_devotional annotations
{
  "title": "Get Audio Devotional",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
memorize_scripture
Advertised by the server during the last successful anonymous check.
Advertised read-only

Help a member learn a verse by heart. Two modes, no key needed. DRILL (omit `attempt`): returns the verse with words blanked out at the level you ask for — level 1 hides a quarter, 3 hides three quarters, 4 leaves first letters only, 5 shows nothing. The same reference and level always produce the same blanks, so practice builds on itself. CHECK (pass `attempt`): scores what they recalled. Returns accuracy, the words they missed, any they added, and `first_divergence` — the index of the first word that went wrong, which is the useful thing to coach on. Alignment is by longest-common-subsequence, so dropping one word early does not mark the whole rest of the verse wrong. Punctuation and capitalisation never count against a member. Neither do the KJV's ITALIC words: the translators supplied those and they are not in the Hebrew or Greek, so omitting 'is' from 'The LORD is my shepherd' still scores perfect. Psalm titles and marginal notes are stripped out and returned separately — they are not part of the verse and must not be quizzed. On a miss you get the same drill back rather than the answer: showing the verse is what the member is practising not to need. `next_level` advances only on a clean recall. Present this as memory work, not as a test of faith. The verdicts are about recall and nothing else.

memorize_scripture input schema
{
  "type": "object",
  "required": [
    "reference"
  ],
  "properties": {
    "level": {
      "type": "integer",
      "default": 1,
      "maximum": 5,
      "minimum": 1,
      "description": "How much to hide: 1 a quarter, 2 half, 3 three quarters, 4 first letters only, 5 nothing at all. Out-of-range values are clamped."
    },
    "attempt": {
      "type": "string",
      "examples": [
        "For God so loved the world that he gave his only begotten Son"
      ],
      "maxLength": 2000,
      "description": "The member's recall, in their own words, to be scored. Omit this for a drill. Punctuation and capitalisation do not matter."
    },
    "reference": {
      "type": "string",
      "pattern": "^[1-3]?\\s?[A-Za-z ]+\\s+\\d+:\\d+$",
      "examples": [
        "John 3:16",
        "Psalms 23:1",
        "Philippians 4:13"
      ],
      "description": "The verse to work on, e.g. 'John 3:16' or '1 Corinthians 13:4'."
    }
  }
}
memorize_scripture annotations
{
  "title": "Scripture Memory Coach",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
synthesize_speech
Advertised by the server during the last successful anonymous check.

Generate spoken-audio (text-to-speech) for a verse, prayer, or devotional in 50+ languages, and get back a playable audio URL. Pass a BCP-47 language (e.g. en-US, es-ES, sw-KE, fil-PH, cmn-CN), optional voice/gender. Results are cached. Requires an API key (audio generation has real cost).

synthesize_speech input schema
{
  "type": "object",
  "required": [
    "text"
  ],
  "properties": {
    "text": {
      "type": "string",
      "examples": [
        "For God so loved the world..."
      ],
      "maxLength": 2000,
      "minLength": 1,
      "description": "The text to synthesize into speech (a verse, prayer, or short devotional)."
    },
    "voice": {
      "type": "string",
      "examples": [
        "en-US-Neural2-D",
        "fil-PH-Chirp3-HD-Achernar",
        "cmn-CN-Chirp3-HD-Achernar"
      ],
      "description": "Optional specific Google Cloud TTS voice name; overrides the default voice for the language. Pass the matching language with it."
    },
    "format": {
      "enum": [
        "mp3",
        "ogg"
      ],
      "type": "string",
      "default": "mp3",
      "description": "Audio container/encoding of the returned URL."
    },
    "gender": {
      "enum": [
        "NEUTRAL",
        "MALE",
        "FEMALE"
      ],
      "type": "string",
      "default": "NEUTRAL",
      "description": "Preferred voice gender when a specific voice is not named."
    },
    "language": {
      "type": "string",
      "default": "en-US",
      "pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{1,8})*$",
      "examples": [
        "en-US",
        "es-ES",
        "sw-KE",
        "fil-PH",
        "cmn-CN"
      ],
      "maxLength": 35,
      "description": "BCP-47 language tag for the voice, as Google Cloud TTS names it: en-US, es-ES, sw-KE, fil-PH (Tagalog/Filipino), cmn-CN (Mandarin). 'tl' is accepted for fil-PH and 'zh' for cmn-CN. If omitted and a voice is named, the voice's own locale is used."
    }
  }
}
synthesize_speech annotations
{
  "title": "Synthesize Speech",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_faith_context
Advertised by the server during the last successful anonymous check.
Advertised read-only

Read a user's portable 'faith context' to personalize your responses — their denomination, preferred language, faith journey, and ministry interests — shared WITH THE USER'S EXPLICIT CONSENT. Requires the user's consent_token with the 'context:read' scope (bound to this agent). Use it to tailor tone, tradition, and language. It returns only the user's declared profile (never their private prayers or journal).

get_faith_context input schema
{
  "type": "object",
  "required": [
    "consent_token"
  ],
  "properties": {
    "consent_token": {
      "type": "string",
      "examples": [
        "sbxc_9f3a2b7c4d5e6f7a…"
      ],
      "minLength": 16,
      "description": "Opaque SoapBox consent token with the 'context:read' scope. The user generates it in the SoapBox app (Settings › AI Agents). The first agent key to use a token is bound to it; a token no agent uses within 24 hours of being created stops working. Returns only the user's declared profile (denomination, preferred language, faith journey, ministry interests) — never their private prayers or journal. An invalid, expired, or wrong-scope token returns an authorization error."
    }
  }
}
get_faith_context annotations
{
  "title": "Get Faith Context",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

SoapBox Faith Content Catalog

Advertised by the server during the last successful anonymous check.

The live catalog of purchasable faith content on SoapBox — sermons, reading plans, books, bundles, and physical goods. Each item has a title, type, description, price, and a web_url. Read this to discover what's available; pay for an item with the pay_with_x402 tool (USDC on Base).

SoapBox Faith Content Catalog URI
soapbox://catalog

MIME type: application/json

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (2 of 2 answered).

  1. 2026-11-06: 1 of 1 checks answered
  2. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
677 ms
95th percentile latency
677 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 677 ms · metadata changed · 25 tool(s), 1 resource(s); warnings: Advertises resources/templates/list but does not implement it

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http soapbox-faith-mcp https://foyekanoxpnkydoibaas.supabase.co/functions/v1/faith-mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add soapbox-faith-mcp --url https://foyekanoxpnkydoibaas.supabase.co/functions/v1/faith-mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable soapbox-faith-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "soapbox-faith-mcp": {
      "url": "https://foyekanoxpnkydoibaas.supabase.co/functions/v1/faith-mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "soapbox-faith-mcp": {
      "type": "streamableHttp",
      "url": "https://foyekanoxpnkydoibaas.supabase.co/functions/v1/faith-mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start soapbox-faith-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "soapbox-faith-mcp": {
      "type": "http",
      "url": "https://foyekanoxpnkydoibaas.supabase.co/functions/v1/faith-mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http soapbox-faith-mcp https://foyekanoxpnkydoibaas.supabase.co/functions/v1/faith-mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://foyekanoxpnkydoibaas.supabase.co/functions/v1/faith-mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "soapbox-faith-mcp": {
      "serverUrl": "https://foyekanoxpnkydoibaas.supabase.co/functions/v1/faith-mcp"
    }
  }
}

Let your agent find its tools

Find servers like SoapBox Faith MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.