Pastor EliMCP reference

Developer reference

Church Website Editor MCP server

A Model Context Protocol server that lets an AI assistant edit a church's website by operating directly on its GitHub repository. Writes commit to the default branch and auto-deploy to production via Vercel in about 30 seconds. 25tools, GitHub-OAuth scoped to the caller's own repositories.

Looking for the plain-English version? See the pastor's guide.

Connection

Endpoint
https://www.elijahdesent.com/api/mcp
Transport
Streamable HTTP (stateless)
Server
elijahdesent-crm v0.10.0
Auth
OAuth 2.1 — identity via GitHub
Authorization metadata
/.well-known/oauth-authorization-server
Protected-resource metadata
/.well-known/oauth-protected-resource

The endpoint advertises OAuth 2.1 with dynamic client registration; the discovery documents above let a compliant MCP client negotiate the flow automatically. Tokens are bound to the GitHub account that has access to the church's repository, so every call is scoped to repos the caller already owns.

Add as a remote connector

{
  "mcpServers": {
    "church-website-editor": {
      "url": "https://www.elijahdesent.com/api/mcp"
    }
  }
}

Most clients (Claude, ChatGPT developer mode, Perplexity) add it through their connector UI instead — see the setup walkthrough. On first connect, the client opens a GitHub sign-in to authorize.

Conventions

  • repo accepts a bare name— the server fills in the caller's GitHub owner. Use owner/name only for another org.
  • Every successful write is one commit to the default branch. Vercel auto-deploys on push; no separate deploy step.
  • Prefer replace_in_file for edits. edit_file replaces the whole file and is guarded against partial-content wipes (allow_shrink to override).
  • read tools never mutate; commit tools push to the repo; status tools report state only.

Tools

Connection & discovery

Establish identity and find the repos and sites the caller can touch.

connection_statusstatus

Confirm the caller is authenticated and the GitHub link is live. Use to diagnose auth failures.

No parameters.

Returns Authenticated user, GitHub link state, and the church site(s) wired to the account.

list_my_sitesstatus

List the church(es) linked to the caller in the CRM, with their live domains.

No parameters.

Returns Array of { church, domain }.

list_reposread

List GitHub repositories the caller can access. Owner-scoped by default.

ParamTypeDescription
filterstringSubstring to filter repo names (e.g. 'baptist').

Returns Array of { name, description, default_branch, private }.

search_reposread

Find a repo by matching across both its name AND description. Broader than list_repos (name-only) — use when you know what a site is about but not its exact repo name.

ParamTypeDescription
queryreqstringText to match against repo name or description (e.g. 'baptist', a town, a pastor's name).
limitintegerHow many matches to return, 1–50. Default 20.

Returns Matching repos, newest first, each with description, visibility, and last-updated.

get_repo_inforead

Report a repo's framework versions so edits match its conventions. Call before any non-trivial code edit.

ParamTypeDescription
reporeqstringRepo as 'owner/name', or bare 'name' to use the caller's GitHub owner.

Returns Next.js / React / Tailwind versions, TypeScript usage, and router (app vs pages).

Reading content

Navigate the tree, read files, search, and inventory live images. All read-only.

list_pagesread

List the contents of a directory. Empty path lists the repo root.

ParamTypeDescription
reporeqstringRepo as 'owner/name', or bare 'name' to use the caller's GitHub owner.
pathstringDirectory path; empty string for repo root (default).
refstringBranch, tag, or SHA. Defaults to the repo's default branch.

Returns Array of { name, type: 'file' | 'dir' }.

read_fileread

Read the full UTF-8 contents of a file. Always read before editing.

ParamTypeDescription
reporeqstringRepo as 'owner/name', or bare 'name' to use the caller's GitHub owner.
pathreqstringFile path within the repo.
refstringBranch, tag, or SHA. Defaults to the repo's default branch.

Returns Full file contents.

search_contentread

Recursive content search (fetches the tree and greps each text file) — works on fresh, unindexed repos.

ParamTypeDescription
reporeqstringRepo as 'owner/name', or bare 'name' to use the caller's GitHub owner.
queryreqstringCase-insensitive text to find.
refstringBranch, tag, or SHA. Defaults to the repo's default branch.
path_prefixstringOnly search paths starting with this (e.g. 'src/app/').

Returns Up to 30 matching files, each with matching line numbers.

list_photosread

Inventory image files with their exact live URLs. Call before pointing a page at a photo to avoid broken-image typos.

ParamTypeDescription
reporeqstringRepo as 'owner/name', or bare 'name' to use the caller's GitHub owner.
folderstringFolder to list from. Defaults to 'public' (site-served images).
refstringBranch, tag, or SHA. Defaults to the repo's default branch.

Returns Array of images with repo path and live URL.

Writing content

Each successful write is one commit to the default branch, which auto-deploys to production via Vercel (~30s).

replace_in_filecommit

Targeted edit — replace exact text. Preferred for small changes; only touches what you specify.

ParamTypeDescription
reporeqstringRepo as 'owner/name', or bare 'name' to use the caller's GitHub owner.
pathreqstringFile path within the repo.
old_stringreqstringExact text to find, whitespace included. Add context to make it unique.
new_stringreqstringReplacement text.
messagereqstringPlain-English commit message.
branchstringBranch to commit to. Defaults to default branch.
replace_allbooleanReplace every occurrence. Default false (must match exactly once).

Returns Commit confirmation.

edit_filecommit

Create a new file or replace a file's FULL contents. Has a shrink guard against partial-content wipes.

ParamTypeDescription
reporeqstringRepo as 'owner/name', or bare 'name' to use the caller's GitHub owner.
pathreqstringFile path within the repo.
contentreqstringFull new file contents (UTF-8).
messagereqstringPlain-English commit message.
branchstringBranch to commit to. Defaults to default branch.
allow_shrinkbooleanOverride the guard that rejects writes dropping >20 lines AND <60% of prior size.

Returns Commit confirmation, or a rejection if the shrink guard trips.

upload_photocommit

Add a photo/video. Called without `data`, returns a one-time upload link; small images commit to the repo, videos & large files route to hosted storage automatically.

ParamTypeDescription
reporeqstringRepo as 'owner/name', or bare 'name' to use the caller's GitHub owner.
pathreqstringSave location. Use 'public/<name>.<ext>' for site-served images.
messagereqstringPlain-English commit message.
datastringAdvanced — base64 image bytes. Omit to get an upload link instead.
branchstringBranch to commit to. Defaults to default branch.

Returns A one-time upload link (default), or a commit confirmation when `data` is supplied.

get_uploaded_photo_urlread

Resolve where an upload landed after the user has used the link from upload_photo.

ParamTypeDescription
tokenreqstringThe upload link (https://.../u/<token>) or the bare token.

Returns HOSTED (permanent storage URL), COMMITTED (live repo path), or PENDING (not uploaded yet).

History & undo

Inspect commits and roll changes back non-destructively.

list_recent_changesread

List recent commits, newest first.

ParamTypeDescription
reporeqstringRepo as 'owner/name', or bare 'name' to use the caller's GitHub owner.
pathstringLimit to commits touching this file/directory.
limitintegerHow many to return, 1–50. Default 15.

Returns Array of { short SHA, time, author, message }.

show_changeread

Get the message, touched files, and diff for one commit.

ParamTypeDescription
reporeqstringRepo as 'owner/name', or bare 'name' to use the caller's GitHub owner.
shareqstringCommit SHA (full or short).

Returns Per-file patch with added/removed lines.

revert_changecommit

Undo a commit by creating a new commit that restores the prior state. Original commit stays in history.

ParamTypeDescription
reporeqstringRepo as 'owner/name', or bare 'name' to use the caller's GitHub owner.
shareqstringCommit SHA to revert.
branchstringBranch to apply the revert on. Defaults to default branch.

Returns Revert commit confirmation.

Deployment

Confirm edits reached production.

check_deploy_statusstatus

Check whether recent edits deployed. Auto-discovers the caller's site(s) from GitHub access.

ParamTypeDescription
repostringNarrow to one repo. Omit to check all of the caller's sites.

Returns Deploy state per site; on failure, the last lines of build output.

Custom domains

Attach a custom domain to a site on Vercel and confirm it's pointing correctly. Scoped to projects linked to repos the caller can access. The pastor changes their nameservers at their registrar; the tools never touch the registrar directly.

connect_domainvercel

Attach a custom domain to the caller's Vercel project and return plain-English instructions to point the domain's nameservers at Vercel (with an A/CNAME alternative for domains that host email). A bare apex auto-pairs its 'www.'. Goes live once nameservers propagate.

ParamTypeDescription
domainreqstringDomain to connect, e.g. 'gracebaptist.org' or 'www.gracebaptist.org'.
repostringWhich site, as 'owner/name' or 'name'. Needed only if the caller has multiple sites.

Returns Confirmation plus the Vercel nameservers to set at the registrar (from the Vercel API, e.g. ns1/ns2.vercel-dns.com), and an A/CNAME fallback.

check_domainstatus

Check whether a connected domain's nameservers point at Vercel and the site is verified and live. When fully live and the caller owns exactly one church, records it as that church's live_domain so analytics attribute traffic.

ParamTypeDescription
domainreqstringDomain to check, e.g. 'gracebaptist.org'.
repostringWhich site, as 'owner/name' or 'name'. Needed only if the caller has multiple sites.

Returns Nameserver status (current vs. expected) + site verification state; when live, confirmation it's been linked for analytics.

redirect_domainvercel

Change where a connected domain points: redirect it to another domain (e.g. an old domain or the non-www version → the main site), or pass redirect_to 'none' to serve directly. Can't chain — the target must not itself be a redirect.

ParamTypeDescription
domainreqstringThe connected domain to change, e.g. 'www.gracebaptist.org'.
redirect_tostringDomain to send visitors to, e.g. 'gracebaptist.org'. Use 'none' (or omit) to turn the redirect off.
permanentbooleanPermanent (308) by default; false for a temporary 307.
repostringWhich site, as 'owner/name' or 'name'. Needed only if the caller has multiple sites.

Returns Confirmation of the new redirect (or that the domain now serves directly). Reports the chaining error if the target is itself a redirect.

Analytics

Read-only traffic data, auto-scoped to the caller's own sites. Pass `church` to disambiguate when they own more than one.

analytics_summaryread

High-level traffic over a recent window.

ParamTypeDescription
churchstringChurch name or live domain.
daysintegerWindow in days, 1–90. Default 28.

Returns Total pageviews, unique visitors (devices), country & device breakdown.

top_pagesread

Most-viewed pages over a recent window.

ParamTypeDescription
churchstringChurch name or live domain.
daysintegerWindow in days, 1–90. Default 28.
limitintegerHow many pages, 1–50. Default 10.

Returns Ranked pages with view counts.

top_referrersread

Top external referrers (direct traffic excluded).

ParamTypeDescription
churchstringChurch name or live domain.
daysintegerWindow in days, 1–90. Default 28.
limitintegerHow many referrers, 1–50.

Returns Ranked referrers with counts.

traffic_by_dayread

Daily pageviews trend for spotting spikes and quiet weeks.

ParamTypeDescription
churchstringChurch name or live domain.
daysintegerWindow in days, 1–90. Default 14.

Returns Pageviews per day.

Scoring

Audit any church website against the Church Website Score rubric.

score_websiteread

Fetch a site's homepage and key subpages and return the grading rubric plus page content. The caller (the model) does the scoring — the tool calls no AI itself.

ParamTypeDescription
urlreqstringThe site to score, e.g. 'gracebaptist.org'.

Returns The full 6-category / 100-point rubric and the fetched page content.

Built and maintained by Pastor Eli (Elijah Desent) · Pastor@elijahdesent.com