websites
ReadThe 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.
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.
https://www.webentwickler.io/mcpwio_mcp_…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.
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:
{year} are preserved.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/mcpThe 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.
For clients without OAuth or for scripts, keys remain available.
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.
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.
Example prompts to copy:
| Setting | Meaning |
|---|---|
| Permission | Read, 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 role | Every 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. |
| Validity | 90 days by default, at most one year. |
| Rate limit | Write calls per hour, 60 by default. |
| Storage | We only store a hash of the key. If it is lost, create a new one and revoke the old one. |
seite_texte, text_suchen or seite_gliederung to locate the right field.vorschau shows old and new side by side, entwurf_stand lists everything pending.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.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.
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.
| Tool | What it does | Permission |
|---|---|---|
websites | 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. | Read |
anleitung | Returns the guide to AI Access: what is allowed, what never is and why, and how publishing and undo work. | Read |
neuigkeiten | What's new in the webentwickler.io CRM, the admin bar and AI Access (release notes). | Read |
datenwege | How we work with your website technically: which server does what, every connection with protocol and encryption, connected services, how backups run. | Read |
zweifaktor_stand | Which team members have set up two-factor sign-in and whether the website requires it for everyone. Read-only. | Read |
seiten_liste | All pages: path, title, type, language, status, who created and last edited them, GEO, SEO and PageSpeed scores. | Read |
seite_steckbrief | Everything about one page: Google title and description, GEO history, change history, open requests. | Read |
seite_texte | All text fields on a page with key, text, character limit and whether they are editable. Call this before any text change. | Read |
text_suchen | Finds a word or phrase across all texts, e.g. an old phone number. | Read |
seite_gliederung | Headings (H1–H6) with allowed levels, bullet lists, free list slots, card rows and, on block pages, the blocks, with outline hints. | Read |
unsichtbare_texte | Texts that don't appear as page copy: Google title and description, image alt texts, business details, cookie notice. | Read |
seo_stand | Page titles and descriptions, measured live, with real queries from Google Search Console and search terms missing from the title. | Read |
suchanfrage_abfragen | Real 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_beobachtet | Watched keywords with their real Google position (28-day average), comparison with the previous period and weekly trend. | Read |
bericht_monat | A month's figures as in the monthly email report: visitors, sources, top pages, enquiries, Google clicks and position, rating, uptime, completed work. | Read |
auffaelligkeiten | Whether anything unusual is happening: visitor drop or spike, enquiries stopped, Google clicks down, many error pages — with baseline and history. | Read |
barrierefreiheit_befunde | 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. | Read |
ki_sichtbarkeit | 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. | Read |
vorschau | All drafts next to the live version (before/after per field). Show this to the human before publishing. | Read |
entwurf_stand | What is waiting to be published: texts and block pages, with time and origin (AI Access or webentwickler.io CRM). | Read |
aenderungen | Log of changes made through AI Access with old and new text and the number used to undo them. | Read |
seite_versionen | 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. | Read |
anpassungen_liste | Your change requests with status (open, in progress, for review, done, declined) and our team's latest reply. | Read |
text_aendern | Change an existing text in one language. The result is a draft; a backup is made automatically first. | Edit |
seo_setzen | Set the page title or meta description. Recommended: title 30–60, description 120–160 characters. | Edit |
alt_text_setzen | Set an image's alt text, 5–250 characters of plain text. Only a human can replace the image itself. | Edit |
liste_bearbeiten | Insert, change, remove or move an item in a bullet list, or create a new list under a paragraph. At most 30 items. | Edit |
ueberschrift_ebene | 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. | Edit |
gruppe_bearbeiten | Add, remove or move a card or entry (benefits, figures, FAQ …). The server renumbers the entries. | Edit |
block_bearbeiten | Block pages: change heading level, insert, remove or move a paragraph, subheading or list, replace texts. Plain text only. | Edit |
rueckgaengig | Undo a single change or everything since a backup. If the old version was already live, publish afterwards. | Edit |
entwurf_verwerfen | Discard AI Access drafts: one text, one block page or everything. Drafts from the webentwickler.io CRM are left untouched. | Edit |
version_zurueckholen | Restore 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_liste | Appointments 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_zeiten | Which times visitors can book right now, per day — minus holidays, existing bookings and busy times from connected calendars. | Read |
termin_absagen | Cancel 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_beauftragen | 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. | Edit |
feedback_melden | 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. | Read |
feedback_stand | Your 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_einreichen | 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. | Edit |
freigaben_offen | Which drafts are waiting for approval (who, when, note) and the status of your own submissions: open, approved, or returned with a reply. | Read |
veroeffentlichen | 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. | Publish |
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.
No parameters.
anleitungReturns the guide to AI Access: what is allowed, what never is and why, and how publishing and undo work.
No parameters.
neuigkeitenWhat's new in the webentwickler.io CRM, the admin bar and AI Access (release notes).
| Parameter | Type | Required | Meaning |
|---|---|---|---|
anzahl | integer | – | Number of entries (default 15, at most 50). |
datenwegeHow we work with your website technically: which server does what, every connection with protocol and encryption, connected services, how backups run.
No parameters.
zweifaktor_standWhich team members have set up two-factor sign-in and whether the website requires it for everyone. Read-only.
No parameters.
seiten_listeAll pages: path, title, type, language, status, who created and last edited them, GEO, SEO and PageSpeed scores.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
typ | string | – | Only pages of this type (optional). Values: startseite, leistung, ortsseite, objekt, referenz, beitrag, seite, rechtliches |
mit_entfernten | boolean | – | Also list pages that are no longer reachable (default: no). |
suche | string | – | Only pages whose title or path contains this (optional). |
seite_steckbriefEverything about one page: Google title and description, GEO history, change history, open requests.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
seite | string | yes | Page path, e.g. "/" or "/service/property-valuation/". |
seite_texteAll text fields on a page with key, text, character limit and whether they are editable. Call this before any text change.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
seite | string | yes | Page path, e.g. "/" or "/services". |
sprache | string | – | Language code, e.g. "de" or "en". Default: the site's main language. |
text_suchenFinds a word or phrase across all texts, e.g. an old phone number.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
begriff | string | yes | Text to find, at least 3 characters. |
sprache | string | – | Search only this language (optional). |
seite_gliederungHeadings (H1–H6) with allowed levels, bullet lists, free list slots, card rows and, on block pages, the blocks, with outline hints.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
seite | string | yes | Page path, e.g. "/" or "/services". |
sprache | string | – | Language code for list items. Default: main language. |
unsichtbare_texteTexts that don't appear as page copy: Google title and description, image alt texts, business details, cookie notice.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
seite | string | – | Page path; its Google texts are listed first (optional). |
sprache | string | – | Language code (default: main language). |
seo_standPage titles and descriptions, measured live, with real queries from Google Search Console and search terms missing from the title.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
seite | string | – | Page path (optional). |
sprache | string | – | Language code (optional). |
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.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
begriff | string | yes | Search term or, with modus=regex, a regular expression in RE2 syntax. |
modus | string | – | enthaelt = contains (default), genau = exact, nicht = does not contain, regex. Values: enthaelt, genau, nicht, regex |
tage | integer | – | Period in days up to the last available day (default 90, 7 to 486). |
geraet | string | – | Only one device type (optional). Values: MOBILE, DESKTOP, TABLET |
keywords_beobachtetWatched keywords with their real Google position (28-day average), comparison with the previous period and weekly trend.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
frisch | boolean | – | Fetch fresh from Google instead of the last 12 hours' snapshot (default: no). |
bericht_monatA month's figures as in the monthly email report: visitors, sources, top pages, enquiries, Google clicks and position, rating, uptime, completed work.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
monat | string | – | Month as YYYY-MM (default: the last completed month). |
auffaelligkeitenWhether anything unusual is happening: visitor drop or spike, enquiries stopped, Google clicks down, many error pages — with baseline and history.
No parameters.
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.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
schwere | string | – | Only findings of this severity (optional). Values: kritisch, mittel, gering |
seite | string | – | Only findings on this page, path like /kontakt/ (optional). |
mit_erklaerung | boolean | – | Also return the accessibility statement (template, formal address) as text (default: no). |
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.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
antworten | boolean | – | Also return an excerpt from every answer (default: no). |
vorschauAll drafts next to the live version (before/after per field). Show this to the human before publishing.
No parameters.
entwurf_standWhat is waiting to be published: texts and block pages, with time and origin (AI Access or webentwickler.io CRM).
No parameters.
aenderungenLog of changes made through AI Access with old and new text and the number used to undo them.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
anzahl | integer | – | Number of entries (default 20, at most 100). |
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.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
seite | string | – | Page path, e.g. "/" or "/service/property-valuation/". |
alle | boolean | – | Timeline of the whole website instead of one page (default: no). |
version | integer | – | Number of a version from the list — returns its details. |
anzahl | integer | – | How many versions (default 20, at most 100). |
anpassungen_listeYour change requests with status (open, in progress, for review, done, declined) and our team's latest reply.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
seite | string | – | Page path (optional). |
status | string | – | offen = new + in progress + for review (default: all). Values: offen, neu, in_arbeit, zur_pruefung, erledigt, abgelehnt, alle |
text_aendernChange an existing text in one language. The result is a draft; a backup is made automatically first.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
schluessel | string | yes | Field key from seite_texte or text_suchen, e.g. "hero.h1". |
text | string | yes | New text. Markup and placeholders such as {year} only if they were already in the previous text. |
sprache | string | – | Language code (default: main language). |
seo_setzenSet the page title or meta description. Recommended: title 30–60, description 120–160 characters.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
seite | string | yes | Page path, e.g. "/services". |
feld | string | yes | titel (title) or beschreibung (description). Values: titel, beschreibung |
text | string | yes | New value, plain text without HTML. |
sprache | string | – | Language code (default: main language). |
alt_text_setzenSet an image's alt text, 5–250 characters of plain text. Only a human can replace the image itself.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
schluessel | string | yes | Key of the alt text, or "block:<nr>" for an image block on a block page. |
text | string | yes | New alt text, plain text. |
seite | string | – | Only with "block:<nr>": path of the block page. |
sprache | string | – | Language code (default: main language). |
liste_bearbeitenInsert, change, remove or move an item in a bullet list, or create a new list under a paragraph. At most 30 items.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
schluessel | string | yes | List key from seite_gliederung, e.g. "meta.intro.list". |
aktion | string | yes | What to do with the item; anlegen = create a new list in a free slot. Values: einfuegen, aendern, entfernen, verschieben, anlegen |
punkte | array | – | Only with anlegen: all items of the new list (instead of text). |
position | integer | – | Item number, from 1. With einfuegen: position of the new item (omitted: at the end). |
nach | integer | – | Only with verschieben: new position, from 1. |
text | string | – | Item text for einfuegen and aendern, without <li>. Markup only if the list already has it. |
sprache | string | – | Language code (default: main language). |
seite | string | – | Path of the page with the list (optional, checked again on publishing). |
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.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
seite | string | yes | Path of the page with the heading. |
schluessel | string | yes | Heading key from seite_gliederung (schluessel_ebene). |
ebene | string | yes | New level. Values: h2, h3, h4 |
gruppe_bearbeitenAdd, remove or move a card or entry (benefits, figures, FAQ …). The server renumbers the entries.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
seite | string | yes | Path of the page with the group. |
gruppe | string | yes | Group name from seite_gliederung, e.g. "meta.vor". |
aktion | string | yes | What to do. Values: hinzufuegen, entfernen, verschieben |
position | integer | – | Entry number from 1. With hinzufuegen: position of the new entry (omitted: at the end). |
nach | integer | – | Only with verschieben: new position from 1. |
felder | object | – | Only with hinzufuegen: text per field, e.g. {"h": {"de": "Titel", "en": "Title"}, "p": {…}}. With a single language {"h": "Title"} is enough. |
block_bearbeitenBlock pages: change heading level, insert, remove or move a paragraph, subheading or list, replace texts. Plain text only.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
seite | string | yes | Path of the block page, e.g. "/service/property-valuation". |
aktion | string | yes | ebene = 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 |
position | integer | – | Block number from seite_gliederung (bloecke[].nr), from 1. With einfuegen: position of the new block (omitted: at the end). |
nach | integer | – | Only with verschieben: new position, from 1. |
ebene | string | – | With ebene: new level. Values: h2, h3, h4 |
typ | string | – | With einfuegen: type of the new block (absatz = paragraph, liste = list). Values: absatz, h2, h3, h4, liste |
text | string | – | With einfuegen (absatz/h2/h3/h4) and text: plain text without HTML. |
punkte | array | – | With einfuegen (liste) and liste: all items, plain text. |
nummeriert | boolean | – | With einfuegen (liste): numbered list instead of bullets. |
rueckgaengigUndo a single change or everything since a backup. If the old version was already live, publish afterwards.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
aenderung | integer | – | Change number from aenderungen. |
sicherung | integer | – | Backup number; resets all texts to that state. |
entwurf_verwerfenDiscard AI Access drafts: one text, one block page or everything. Drafts from the webentwickler.io CRM are left untouched.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
schluessel | string | – | Discard one text field. |
sprache | string | – | Language of the text field (default: main language). |
seite | string | – | Discard all drafts of this block page. |
alles | boolean | – | Discard all AI Access drafts. |
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.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
version | integer | yes | Number of the version from seite_versionen. |
vorher | boolean | – | Restore the state BEFORE this version, i.e. undo exactly this change (default: no = state after the version). |
termine_listeAppointments booked through the website, as in the “Appointments” tab: when, type, name, contact, message and status, plus upcoming bookings and open requests.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
zeitraum | string | – | kommend (upcoming, default) or vergangen (past). Values: kommend, vergangen |
tage | integer | – | How many days ahead or back (default 60 or 30, at most 366). |
mit_abgesagten | boolean | – | Also show cancelled and declined appointments (default: no). |
termine_freie_zeitenWhich times visitors can book right now, per day — minus holidays, existing bookings and busy times from connected calendars.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
terminart | string | – | Name or id of the appointment type (default: the first bookable one). |
von | string | – | First day as YYYY-MM-DD (default: today). |
tage | integer | – | How many days from "von" (default 14, at most 31). |
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.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
id | integer | yes | id of the appointment from termine_liste. |
grund | string | – | Reason for the person who booked, included in the email (optional, at most 500 characters). |
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.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
wunsch | string | yes | What should be changed, as specifically as possible. |
seite | string | – | Path of the affected page (optional). |
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.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
art | string | yes | fehler = something does not work, idee = something is missing or could be simpler, lob = praise, frage = how do I …? Values: fehler, idee, lob, frage |
text | string | yes | What it is about, in full sentences: what happened and what you expected (at most 5000 characters). |
bereich | string | – | Affected area of the CRM, e.g. “Editor” or “AI Access” (optional). |
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.
No parameters.
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.
| Parameter | Type | Required | Meaning |
|---|---|---|---|
notiz | string | – | Short note for the person who approves (optional, at most 1000 characters). |
freigaben_offenWhich drafts are waiting for approval (who, when, note) and the status of your own submissions: open, approved, or returned with a reply.
No parameters.
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.
No parameters.
seite_gliederung (bearbeitbar).seite_gliederung lists free slots under steckplaetze; liste_bearbeiten with aktion: anlegen inserts a list there.seite_gliederung reports as hoechstens.seite_gliederung shows nothing switchable, our team converts the template once, via anpassung_beauftragen.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.
| Method | Response |
|---|---|
initialize | Protocol 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/list | The tools for the key's permission, with inputSchema and annotations (readOnlyHint etc.). |
tools/call | Result as text (content) and as an object (structuredContent); isError for rejected calls. |
ping | Empty result. |
resources/list, prompts/list | Empty lists. |
Notifications (no id) | HTTP 202 without body |
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.
| URL | Purpose |
|---|---|
/.well-known/oauth-protected-resource/mcp | Protected Resource Metadata (RFC 9728) |
/.well-known/oauth-authorization-server | Authorization Server Metadata (RFC 8414) |
/oauth/register | Dynamic Client Registration (RFC 7591) |
/oauth/authorize | Consent in the webentwickler.io CRM; authorization code with PKCE S256 only |
/oauth/token | authorization_code and refresh_token; access token 1 hour, rotating refresh tokens |
/oauth/revoke | Token Revocation (RFC 7009) |
https://claude.ai/api/mcp/auth_callback, https://claude.com/api/mcp/auth_callback and the local device (http://localhost, 127.0.0.1, [::1]). We enable other clients on request.resource parameter must be https://www.webentwickler.io/mcp. The scope is mcp; website and permission are chosen by the human on the consent page.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 | Code | Meaning |
|---|---|---|
| 200 | – | Response or tool result (rejected tool calls too, then isError: true) |
| 202 | – | Notification accepted |
| 400 | -32700 | Invalid JSON |
| 401 | -32001 | Not 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 | -32600 | Invalid request (not JSON-RPC 2.0) |
| 200 | -32601 | Unknown method |
| 405 | – | Method other than POST/OPTIONS; a plain GET returns a short JSON description. |
| 500 | -32603 | Internal error |
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 from the server are in German. The most important ones:
The live texts differ from the source in the webentwickler.io CRM. Have them re-imported there or let us know.
A block page was changed elsewhere in the meantime. Discard that page's draft with entwurf_verwerfen and edit again.
A person has an unpublished draft in the webentwickler.io CRM. Only they can publish or discard it, in the editor.
The field is not text or belongs to a locked area. The message states the reason.
Too many write calls in the last hour.
Your website's server could not be reached. Nothing was changed.
The previous version was restored automatically. Please get in touch with us.
datenwege tool and the “Datenwege” tab in the webentwickler.io CRM.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.