AI Access for your website (MCP): Documentation

AI Access lets assistants such as Claude read, edit and publish the content of your website. You write, for example, “Add our holiday closure from 23 to 27 December to the home page”, and the assistant does it through the same checked paths the webentwickler.io CRM uses. This page covers setup, tools and limits.

Last updated 29 October 2026 · Stage 2 (pilot) · Model Context Protocol

At a glance

Endpoint
https://www.webentwickler.io/mcp
Transport
Streamable HTTP, JSON-RPC 2.0, stateless
Authentication
OAuth 2.1 (connector) or key wio_mcp_…
Protocol versions
2025-06-18, 2025-03-26, 2024-11-05
Tools
42: 28 read, 13 edit, 1 publish
Location
Our server in Germany

AI Access is part of the webentwickler.io CRM for websites we build and maintain. It currently runs as a pilot for selected customers. A key or connection always belongs to exactly one website.

The one rule: content yes, technology never

AI Access may change what your site says: texts, page titles and descriptions for Google. It may never change how your site works. This boundary does not rely on asking the AI nicely; it is built into the server code:

  • There is no tool for code, templates, forms, tracking, cookie banners, redirects or page structure. What doesn't exist cannot be used.
  • Every new text is checked: no scripts, no event attributes, no new HTML markup; placeholders such as {year} are preserved.
  • A backup is created automatically before every edit. Without a backup, nothing is changed.
  • After every publication several pages are fetched and compared with the previous state. If anything other than text changed, the previous version is restored immediately.

Setup

Without a key: sign in as a connector

claude.ai and Claude Desktop: Settings → Connectors → “Add custom connector”. Enter https://www.webentwickler.io/mcp as the URL and choose “Connect”. The webentwickler.io CRM sign-in opens (a login link by email if you are not signed in). Choose website, permission and how long the connection lasts, then confirm.

Claude Code: add without a key, then type /mcp in Claude Code and choose “Authenticate”:

claude mcp add --transport http webseite https://www.webentwickler.io/mcp

The connection appears in the “KI-Zugang für Ihre Website (MCP)” tab as “Anmeldung (OAuth)” and can be disconnected there at any time. If you did not start the connection yourself, choose “Ablehnen” (decline) on the consent page.

With a key

For clients without OAuth or for scripts, keys remain available.

1. Create a key

In the webentwickler.io CRM, open the tab “KI-Zugang für Ihre Website (MCP)” and click “Neuer Schlüssel” (new key). Choose name, permission, validity and limit (see Keys and permissions). The key starts with wio_mcp_ and is shown exactly once.

2. Connect your AI assistant

Claude Code: one terminal command, insert your key:

claude mcp add --transport http webseite https://www.webentwickler.io/mcp --header "Authorization: Bearer wio_mcp_…"

Claude Desktop: under Settings → Developer → “Edit Config” add this entry (requires Node.js) and restart Claude Desktop:

{
  "mcpServers": {
    "webseite": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://www.webentwickler.io/mcp",
               "--header", "Authorization:${AUTH}"],
      "env": { "AUTH": "Bearer wio_mcp_…" }
    }
  }
}

Other clients: Any client that speaks MCP over “Streamable HTTP” (e.g. Cursor) works with the address above, using sign-in (OAuth) or the header Authorization: Bearer wio_mcp_…. Where a firewall strips that header, use X-Api-Token: wio_mcp_… instead.

3. Try it

Example prompts to copy:

Keys and permissions

SettingMeaning
PermissionRead, Edit (drafts) or Publish. Each level includes the ones below. If you want to review every change yourself, choose “Edit” and publish in the webentwickler.io CRM. A key only sees the tools its permission allows.
Team roleEvery person has a role on the website (Owner, Admin, Editorial, Author, SEO, Reader), assigned by the owner or admin in the “Team & Rechte” tab and adjustable per area. Only roles with the “page structure” right can change lists, cards, heading levels and paragraphs; people who may not publish submit for approval with freigabe_einreichen. A key or connection can never do more than the person it belongs to: the tool list only shows what both the key's permission and the role allow. websites reports the role and the blocked tools. Role changes apply immediately.
Validity90 days by default, at most one year.
Rate limitWrite calls per hour, 60 by default.
StorageWe only store a hash of the key. If it is lost, create a new one and revoke the old one.

Draft, publish, undo

  1. Find: use seite_texte, text_suchen or seite_gliederung to locate the right field.
  2. Edit: every editing tool creates a draft. The website does not show it yet. The server makes a backup first.
  3. Review: vorschau shows old and new side by side, entwurf_stand lists everything pending.
  4. Publish: veroeffentlichen publishes all AI Access drafts at once. If something was changed directly on the website in the meantime, the server refuses so nothing is overwritten. Drafts someone started in the webentwickler.io CRM are not included.
  5. Undo: rueckgaengig reverts one change (number from aenderungen) or everything since a backup; if the old version was already live, publish again afterwards. entwurf_verwerfen discards drafts without touching the website.

Block pages (e.g. service pages built from blocks) are drafts too. On publishing, the server writes block pages first, each backed up beforehand, then texts, and checks those pages afterwards. You see the same drafts in the admin bar and the editor of the webentwickler.io CRM.

The 42 tools

Tool and parameter names are German and fixed; this is how the assistant calls them. The list matches what the server returns for tools/list.

ToolWhat it doesPermission
websitesThe website this key belongs to: name, address, languages, last publication, the key's permissions and the person's team role including blocked tools. A good first call.Read
anleitungReturns the guide to AI Access: what is allowed, what never is and why, and how publishing and undo work.Read
neuigkeitenWhat's new in the webentwickler.io CRM, the admin bar and AI Access (release notes).Read
datenwegeHow we work with your website technically: which server does what, every connection with protocol and encryption, connected services, how backups run.Read
zweifaktor_standWhich team members have set up two-factor sign-in and whether the website requires it for everyone. Read-only.Read
seiten_listeAll pages: path, title, type, language, status, who created and last edited them, GEO, SEO and PageSpeed scores.Read
seite_steckbriefEverything about one page: Google title and description, GEO history, change history, open requests.Read
seite_texteAll text fields on a page with key, text, character limit and whether they are editable. Call this before any text change.Read
text_suchenFinds a word or phrase across all texts, e.g. an old phone number.Read
seite_gliederungHeadings (H1–H6) with allowed levels, bullet lists, free list slots, card rows and, on block pages, the blocks, with outline hints.Read
unsichtbare_texteTexts that don't appear as page copy: Google title and description, image alt texts, business details, cookie notice.Read
seo_standPage titles and descriptions, measured live, with real queries from Google Search Console and search terms missing from the title.Read
suchanfrage_abfragenReal Google data for a query, as in Search Console: clicks, impressions, average position, weekly trend, matching queries and pages, up to 16 months.Read
keywords_beobachtetWatched keywords with their real Google position (28-day average), comparison with the previous period and weekly trend.Read
bericht_monatA month's figures as in the monthly email report: visitors, sources, top pages, enquiries, Google clicks and position, rating, uptime, completed work.Read
auffaelligkeitenWhether anything unusual is happening: visitor drop or spike, enquiries stopped, Google clicks down, many error pages — with baseline and history.Read
barrierefreiheit_befundeFindings of the latest accessibility check against WCAG 2.2 AA (German Accessibility Act, BFSG): criterion, severity, explanation, fix, affected pages, conformance status and Lighthouse score — optionally with the accessibility statement.Read
ki_sichtbarkeitWhether ChatGPT, Perplexity, Gemini and Claude mention your business when customers ask typical questions: share in percent, per assistant and question, position, who is named instead and which sources the assistants read.Read
vorschauAll drafts next to the live version (before/after per field). Show this to the human before publishing.Read
entwurf_standWhat is waiting to be published: texts and block pages, with time and origin (AI Access or webentwickler.io CRM).Read
aenderungenLog of changes made through AI Access with old and new text and the number used to undo them.Read
seite_versionenA page's timeline: for every publish, when, who, from where and what changed; with a number, every field before/after and the difference to today.Read
anpassungen_listeYour change requests with status (open, in progress, for review, done, declined) and our team's latest reply.Read
text_aendernChange an existing text in one language. The result is a draft; a backup is made automatically first.Edit
seo_setzenSet the page title or meta description. Recommended: title 30–60, description 120–160 characters.Edit
alt_text_setzenSet an image's alt text, 5–250 characters of plain text. Only a human can replace the image itself.Edit
liste_bearbeitenInsert, change, remove or move an item in a bullet list, or create a new list under a paragraph. At most 30 items.Edit
ueberschrift_ebeneTurn a heading into an H2, H3 or H4. The look stays the same; applies to all languages. The server rejects anything that breaks the outline.Edit
gruppe_bearbeitenAdd, remove or move a card or entry (benefits, figures, FAQ …). The server renumbers the entries.Edit
block_bearbeitenBlock pages: change heading level, insert, remove or move a paragraph, subheading or list, replace texts. Plain text only.Edit
rueckgaengigUndo a single change or everything since a backup. If the old version was already live, publish afterwards.Edit
entwurf_verwerfenDiscard AI Access drafts: one text, one block page or everything. Drafts from the webentwickler.io CRM are left untouched.Edit
version_zurueckholenRestore the state after an earlier version (or, with vorher=true, the state before it) as a draft; it goes live only with veroeffentlichen.Edit
termine_listeAppointments booked through the website, as in the “Appointments” tab: when, type, name, contact, message and status, plus upcoming bookings and open requests.Read
termine_freie_zeitenWhich times visitors can book right now, per day — minus holidays, existing bookings and busy times from connected calendars.Read
termin_absagenCancel an appointment or decline a request: the person who booked gets an email that removes the calendar entry; the slot becomes free again.Edit
anpassung_beauftragenFor everything AI Access may not do itself (design, structure, forms, technology, images, menu, legal texts): a request to our team. A human reviews and implements it.Edit
feedback_meldenReport a bug, idea, praise or question about the webentwickler.io CRM itself to our team, with a ticket number (FB-0012). The answer arrives in the CRM and by email. The “Read” permission is enough. For changes to the website: anpassung_beauftragen.Read
feedback_standYour own feedback reports with their status (received, in progress, done, answered, not planned) and our replies. Other people's reports are not visible.Read
freigabe_einreichenFor people without permission to publish (e.g. the Author role): submits the pending draft for approval. Everyone allowed to publish is notified in the webentwickler.io CRM. Optional note.Edit
freigaben_offenWhich drafts are waiting for approval (who, when, note) and the status of your own submissions: open, approved, or returned with a reply.Read
veroeffentlichenPublishes all AI Access drafts. Before: comparison with the website and backup. After: pages are checked; on any deviation the previous version is restored automatically.Publish

Orientation

websites

Read

The website this key belongs to: name, address, languages, last publication, the key's permissions and the person's team role including blocked tools. A good first call.

No parameters.

anleitung

Read

Returns the guide to AI Access: what is allowed, what never is and why, and how publishing and undo work.

No parameters.

neuigkeiten

Read

What's new in the webentwickler.io CRM, the admin bar and AI Access (release notes).

ParameterTypeRequiredMeaning
anzahlinteger–Number of entries (default 15, at most 50).

datenwege

Read

How we work with your website technically: which server does what, every connection with protocol and encryption, connected services, how backups run.

No parameters.

zweifaktor_stand

Read

Which team members have set up two-factor sign-in and whether the website requires it for everyone. Read-only.

No parameters.

Reading pages and texts

seiten_liste

Read

All pages: path, title, type, language, status, who created and last edited them, GEO, SEO and PageSpeed scores.

ParameterTypeRequiredMeaning
typstring–Only pages of this type (optional).
Values: startseite, leistung, ortsseite, objekt, referenz, beitrag, seite, rechtliches
mit_entferntenboolean–Also list pages that are no longer reachable (default: no).
suchestring–Only pages whose title or path contains this (optional).

seite_steckbrief

Read

Everything about one page: Google title and description, GEO history, change history, open requests.

ParameterTypeRequiredMeaning
seitestringyesPage path, e.g. "/" or "/service/property-valuation/".

seite_texte

Read

All text fields on a page with key, text, character limit and whether they are editable. Call this before any text change.

ParameterTypeRequiredMeaning
seitestringyesPage path, e.g. "/" or "/services".
sprachestring–Language code, e.g. "de" or "en". Default: the site's main language.

text_suchen

Read

Finds a word or phrase across all texts, e.g. an old phone number.

ParameterTypeRequiredMeaning
begriffstringyesText to find, at least 3 characters.
sprachestring–Search only this language (optional).

seite_gliederung

Read

Headings (H1–H6) with allowed levels, bullet lists, free list slots, card rows and, on block pages, the blocks, with outline hints.

ParameterTypeRequiredMeaning
seitestringyesPage path, e.g. "/" or "/services".
sprachestring–Language code for list items. Default: main language.

unsichtbare_texte

Read

Texts that don't appear as page copy: Google title and description, image alt texts, business details, cookie notice.

ParameterTypeRequiredMeaning
seitestring–Page path; its Google texts are listed first (optional).
sprachestring–Language code (default: main language).

SEO, Google, AI visibility, accessibility and monthly report

seo_stand

Read

Page titles and descriptions, measured live, with real queries from Google Search Console and search terms missing from the title.

ParameterTypeRequiredMeaning
seitestring–Page path (optional).
sprachestring–Language code (optional).

suchanfrage_abfragen

Read

Real Google data for a query, as in Search Console: clicks, impressions, average position, weekly trend, matching queries and pages, up to 16 months.

ParameterTypeRequiredMeaning
begriffstringyesSearch term or, with modus=regex, a regular expression in RE2 syntax.
modusstring–enthaelt = contains (default), genau = exact, nicht = does not contain, regex.
Values: enthaelt, genau, nicht, regex
tageinteger–Period in days up to the last available day (default 90, 7 to 486).
geraetstring–Only one device type (optional).
Values: MOBILE, DESKTOP, TABLET

keywords_beobachtet

Read

Watched keywords with their real Google position (28-day average), comparison with the previous period and weekly trend.

ParameterTypeRequiredMeaning
frischboolean–Fetch fresh from Google instead of the last 12 hours' snapshot (default: no).

bericht_monat

Read

A month's figures as in the monthly email report: visitors, sources, top pages, enquiries, Google clicks and position, rating, uptime, completed work.

ParameterTypeRequiredMeaning
monatstring–Month as YYYY-MM (default: the last completed month).

auffaelligkeiten

Read

Whether anything unusual is happening: visitor drop or spike, enquiries stopped, Google clicks down, many error pages — with baseline and history.

No parameters.

barrierefreiheit_befunde

Read

Findings of the latest accessibility check against WCAG 2.2 AA (German Accessibility Act, BFSG): criterion, severity, explanation, fix, affected pages, conformance status and Lighthouse score — optionally with the accessibility statement.

ParameterTypeRequiredMeaning
schwerestring–Only findings of this severity (optional).
Values: kritisch, mittel, gering
seitestring–Only findings on this page, path like /kontakt/ (optional).
mit_erklaerungboolean–Also return the accessibility statement (template, formal address) as text (default: no).

ki_sichtbarkeit

Read

Whether ChatGPT, Perplexity, Gemini and Claude mention your business when customers ask typical questions: share in percent, per assistant and question, position, who is named instead and which sources the assistants read.

ParameterTypeRequiredMeaning
antwortenboolean–Also return an excerpt from every answer (default: no).

Drafts, history and requests

vorschau

Read

All drafts next to the live version (before/after per field). Show this to the human before publishing.

No parameters.

entwurf_stand

Read

What is waiting to be published: texts and block pages, with time and origin (AI Access or webentwickler.io CRM).

No parameters.

aenderungen

Read

Log of changes made through AI Access with old and new text and the number used to undo them.

ParameterTypeRequiredMeaning
anzahlinteger–Number of entries (default 20, at most 100).

seite_versionen

Read

A page's timeline: for every publish, when, who, from where and what changed; with a number, every field before/after and the difference to today.

ParameterTypeRequiredMeaning
seitestring–Page path, e.g. "/" or "/service/property-valuation/".
alleboolean–Timeline of the whole website instead of one page (default: no).
versioninteger–Number of a version from the list — returns its details.
anzahlinteger–How many versions (default 20, at most 100).

anpassungen_liste

Read

Your change requests with status (open, in progress, for review, done, declined) and our team's latest reply.

ParameterTypeRequiredMeaning
seitestring–Page path (optional).
statusstring–offen = new + in progress + for review (default: all).
Values: offen, neu, in_arbeit, zur_pruefung, erledigt, abgelehnt, alle

Changing content (draft)

text_aendern

Edit

Change an existing text in one language. The result is a draft; a backup is made automatically first.

ParameterTypeRequiredMeaning
schluesselstringyesField key from seite_texte or text_suchen, e.g. "hero.h1".
textstringyesNew text. Markup and placeholders such as {year} only if they were already in the previous text.
sprachestring–Language code (default: main language).

seo_setzen

Edit

Set the page title or meta description. Recommended: title 30–60, description 120–160 characters.

ParameterTypeRequiredMeaning
seitestringyesPage path, e.g. "/services".
feldstringyestitel (title) or beschreibung (description).
Values: titel, beschreibung
textstringyesNew value, plain text without HTML.
sprachestring–Language code (default: main language).

alt_text_setzen

Edit

Set an image's alt text, 5–250 characters of plain text. Only a human can replace the image itself.

ParameterTypeRequiredMeaning
schluesselstringyesKey of the alt text, or "block:<nr>" for an image block on a block page.
textstringyesNew alt text, plain text.
seitestring–Only with "block:<nr>": path of the block page.
sprachestring–Language code (default: main language).

liste_bearbeiten

Edit

Insert, change, remove or move an item in a bullet list, or create a new list under a paragraph. At most 30 items.

ParameterTypeRequiredMeaning
schluesselstringyesList key from seite_gliederung, e.g. "meta.intro.list".
aktionstringyesWhat to do with the item; anlegen = create a new list in a free slot.
Values: einfuegen, aendern, entfernen, verschieben, anlegen
punktearray–Only with anlegen: all items of the new list (instead of text).
positioninteger–Item number, from 1. With einfuegen: position of the new item (omitted: at the end).
nachinteger–Only with verschieben: new position, from 1.
textstring–Item text for einfuegen and aendern, without <li>. Markup only if the list already has it.
sprachestring–Language code (default: main language).
seitestring–Path of the page with the list (optional, checked again on publishing).

ueberschrift_ebene

Edit

Turn a heading into an H2, H3 or H4. The look stays the same; applies to all languages. The server rejects anything that breaks the outline.

ParameterTypeRequiredMeaning
seitestringyesPath of the page with the heading.
schluesselstringyesHeading key from seite_gliederung (schluessel_ebene).
ebenestringyesNew level.
Values: h2, h3, h4

gruppe_bearbeiten

Edit

Add, remove or move a card or entry (benefits, figures, FAQ …). The server renumbers the entries.

ParameterTypeRequiredMeaning
seitestringyesPath of the page with the group.
gruppestringyesGroup name from seite_gliederung, e.g. "meta.vor".
aktionstringyesWhat to do.
Values: hinzufuegen, entfernen, verschieben
positioninteger–Entry number from 1. With hinzufuegen: position of the new entry (omitted: at the end).
nachinteger–Only with verschieben: new position from 1.
felderobject–Only with hinzufuegen: text per field, e.g. {"h": {"de": "Titel", "en": "Title"}, "p": {…}}. With a single language {"h": "Title"} is enough.

block_bearbeiten

Edit

Block pages: change heading level, insert, remove or move a paragraph, subheading or list, replace texts. Plain text only.

ParameterTypeRequiredMeaning
seitestringyesPath of the block page, e.g. "/service/property-valuation".
aktionstringyesebene = change heading level; einfuegen = new block; text = replace a paragraph's or heading's text; liste = replace all items of a list.
Values: ebene, einfuegen, entfernen, verschieben, text, liste
positioninteger–Block number from seite_gliederung (bloecke[].nr), from 1. With einfuegen: position of the new block (omitted: at the end).
nachinteger–Only with verschieben: new position, from 1.
ebenestring–With ebene: new level.
Values: h2, h3, h4
typstring–With einfuegen: type of the new block (absatz = paragraph, liste = list).
Values: absatz, h2, h3, h4, liste
textstring–With einfuegen (absatz/h2/h3/h4) and text: plain text without HTML.
punktearray–With einfuegen (liste) and liste: all items, plain text.
nummeriertboolean–With einfuegen (liste): numbered list instead of bullets.

Undo and discard

rueckgaengig

Edit

Undo a single change or everything since a backup. If the old version was already live, publish afterwards.

ParameterTypeRequiredMeaning
aenderunginteger–Change number from aenderungen.
sicherunginteger–Backup number; resets all texts to that state.

entwurf_verwerfen

Edit

Discard AI Access drafts: one text, one block page or everything. Drafts from the webentwickler.io CRM are left untouched.

ParameterTypeRequiredMeaning
schluesselstring–Discard one text field.
sprachestring–Language of the text field (default: main language).
seitestring–Discard all drafts of this block page.
allesboolean–Discard all AI Access drafts.

version_zurueckholen

Edit

Restore the state after an earlier version (or, with vorher=true, the state before it) as a draft; it goes live only with veroeffentlichen.

ParameterTypeRequiredMeaning
versionintegeryesNumber of the version from seite_versionen.
vorherboolean–Restore the state BEFORE this version, i.e. undo exactly this change (default: no = state after the version).

Online booking

termine_liste

Read

Appointments booked through the website, as in the “Appointments” tab: when, type, name, contact, message and status, plus upcoming bookings and open requests.

ParameterTypeRequiredMeaning
zeitraumstring–kommend (upcoming, default) or vergangen (past).
Values: kommend, vergangen
tageinteger–How many days ahead or back (default 60 or 30, at most 366).
mit_abgesagtenboolean–Also show cancelled and declined appointments (default: no).

termine_freie_zeiten

Read

Which times visitors can book right now, per day — minus holidays, existing bookings and busy times from connected calendars.

ParameterTypeRequiredMeaning
terminartstring–Name or id of the appointment type (default: the first bookable one).
vonstring–First day as YYYY-MM-DD (default: today).
tageinteger–How many days from "von" (default 14, at most 31).

termin_absagen

Edit

Cancel an appointment or decline a request: the person who booked gets an email that removes the calendar entry; the slot becomes free again.

ParameterTypeRequiredMeaning
idintegeryesid of the appointment from termine_liste.
grundstring–Reason for the person who booked, included in the email (optional, at most 500 characters).

Requests and feedback to our team

anpassung_beauftragen

Edit

For everything AI Access may not do itself (design, structure, forms, technology, images, menu, legal texts): a request to our team. A human reviews and implements it.

ParameterTypeRequiredMeaning
wunschstringyesWhat should be changed, as specifically as possible.
seitestring–Path of the affected page (optional).

feedback_melden

Read

Report a bug, idea, praise or question about the webentwickler.io CRM itself to our team, with a ticket number (FB-0012). The answer arrives in the CRM and by email. The “Read” permission is enough. For changes to the website: anpassung_beauftragen.

ParameterTypeRequiredMeaning
artstringyesfehler = something does not work, idee = something is missing or could be simpler, lob = praise, frage = how do I …?
Values: fehler, idee, lob, frage
textstringyesWhat it is about, in full sentences: what happened and what you expected (at most 5000 characters).
bereichstring–Affected area of the CRM, e.g. “Editor” or “AI Access” (optional).

feedback_stand

Read

Your own feedback reports with their status (received, in progress, done, answered, not planned) and our replies. Other people's reports are not visible.

No parameters.

Approval and publishing

freigabe_einreichen

Edit

For people without permission to publish (e.g. the Author role): submits the pending draft for approval. Everyone allowed to publish is notified in the webentwickler.io CRM. Optional note.

ParameterTypeRequiredMeaning
notizstring–Short note for the person who approves (optional, at most 1000 characters).

freigaben_offen

Read

Which drafts are waiting for approval (who, when, note) and the status of your own submissions: open, approved, or returned with a reply.

No parameters.

veroeffentlichen

Publish

Publishes all AI Access drafts. Before: comparison with the website and backup. After: pages are checked; on any deviation the previous version is restored automatically.

No parameters.

Outline: headings, lists, cards

Protocol and error codes

Every request is a POST with JSON-RPC 2.0; the response is application/json. No persistent connection, no session ID, no server-sent event stream. Batches (JSON arrays) from older protocol versions are accepted.

MethodResponse
initializeProtocol version (the requested one if supported, otherwise 2025-06-18), capabilities.tools, serverInfo (webentwickler-ki-zugang) and instructions with the rule and recommended workflow.
tools/listThe tools for the key's permission, with inputSchema and annotations (readOnlyHint etc.).
tools/callResult as text (content) and as an object (structuredContent); isError for rejected calls.
pingEmpty result.
resources/list, prompts/listEmpty lists.
Notifications (no id)HTTP 202 without body

Authorization (OAuth 2.1)

Implemented per the MCP “Authorization” specification (2025-06-18). Without credentials /mcp answers 401 with WWW-Authenticate: Bearer resource_metadata=…, which tells the client where to sign in.

URLPurpose
/.well-known/oauth-protected-resource/mcpProtected Resource Metadata (RFC 9728)
/.well-known/oauth-authorization-serverAuthorization Server Metadata (RFC 8414)
/oauth/registerDynamic Client Registration (RFC 7591)
/oauth/authorizeConsent in the webentwickler.io CRM; authorization code with PKCE S256 only
/oauth/tokenauthorization_code and refresh_token; access token 1 hour, rotating refresh tokens
/oauth/revokeToken Revocation (RFC 7009)

Example

curl https://www.webentwickler.io/mcp \
  -H "Authorization: Bearer wio_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":"test","version":"1.0"}}}'
curl https://www.webentwickler.io/mcp \
  -H "Authorization: Bearer wio_mcp_…" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
       "params":{"name":"text_suchen","arguments":{"begriff":"04103 123456"}}}'

Response to tools/call:

{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "content": [{ "type": "text", "text": "{ … }" }],
    "structuredContent": { … },
    "isError": false
  }
}

HTTP status and JSON-RPC errors

HTTPCodeMeaning
200–Response or tool result (rejected tool calls too, then isError: true)
202–Notification accepted
400-32700Invalid JSON
401-32001Not signed in; key, connection or access token unknown, revoked or expired (the client renews an expired access token itself); website not enabled; creator no longer has access. The message states the reason.
200-32600Invalid request (not JSON-RPC 2.0)
200-32601Unknown method
405–Method other than POST/OPTIONS; a plain GET returns a short JSON description.
500-32603Internal error

What AI Access never does

Also locked in stage 1: legal texts (imprint, privacy policy), business details (phone, address, links), FAQ entries, menu labels and images themselves. Alt texts are allowed via alt_text_setzen. For everything else the AI files a request via anpassung_beauftragen; our team reviews and implements it, and anpassungen_liste shows the status.

Messages

Messages from the server are in German. The most important ones:

“Auf der Website wurde direkt etwas geändert …” (changed directly on the website)

The live texts differ from the source in the webentwickler.io CRM. Have them re-imported there or let us know.

“… wurde auf dem Server geändert, seit der Entwurf begonnen hat” (changed on the server since the draft began)

A block page was changed elsewhere in the meantime. Discard that page's draft with entwurf_verwerfen and edit again.

“… Änderungen, die nicht über den KI-Zugang kamen” (changes not made through AI Access)

A person has an unpublished draft in the webentwickler.io CRM. Only they can publish or discard it, in the editor.

“Gesperrt: …” (locked)

The field is not text or belongs to a locked area. The message states the reason.

“Obergrenze erreicht” (limit reached)

Too many write calls in the last hour.

“Datensicherung fehlgeschlagen” (backup failed)

Your website's server could not be reached. Nothing was changed.

“Nach dem Veröffentlichen hat sich mehr als Text geändert” (more than text changed after publishing)

The previous version was restored automatically. Please get in touch with us.

Privacy

Disconnecting and revoking

If a device is lost or someone leaves the team: click “Widerrufen” (revoke) next to the key or connection in the tab. It takes effect immediately, including for tokens already issued. A key or connection also stops working automatically when it expires or when the person who created it no longer has access to your website.

Background for non-technical readers (in German): Was ist MCP? Questions or interest in the pilot: info@webentwickler.io.