Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 33 additions & 47 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,72 +5,58 @@ makes existing web apps agent-ready via [WebMCP](https://webmachinelearning.gith
(`document.modelContext`), with a human approval gate and real-browser verification of
every exposed tool.

Static site with a dependency-free German-page generator: HTML, CSS, JavaScript,
`robots.txt` and `sitemap.xml` are served directly.
English default with a client-side German toggle. `/de/` is the crawlable German
variant — regenerate it with `python3 build-de.py` after editing `index.html`
and commit both files (hreflang pairs live in both pages and `sitemap.xml`).
This repository contains the static site. It uses plain HTML, CSS and JavaScript,
plus dependency-free generators for derived files.

Routes:

| Path | Purpose |
|---|---|
| `/` · `/de/` | start page (bilingual copy, `/de/` generated from `index.html`) |
| `/webmcp-agent-skill/` | the category page: **its title and `<h1>` must keep the phrase "WebMCP agent skill"** — `webmcpify` is a coined single token and cannot rank for it. Bilingual in place, no separate `/de/` variant, so it is not part of `build-de.py`. Per-runtime install instructions live here. |
| `/docs/` | technical entry point: coverage targets, evidence-aware resume, scoped verification and dated source boundaries |
| `/docs/site-tools/` | dated ChatGPT Site tools setup and troubleshooting guide; official claims must stay sourced |
| `/` · `/de/` | Start page in English and German |
| `/webmcp-agent-skill/` | WebMCP agent skill overview and installation instructions |
| `/docs/` | Technical documentation |
| `/docs/site-tools/` | ChatGPT Site tools setup and troubleshooting guide |
| `/imprint.html` · `/privacy.html` | legal pages (`noindex`) |

`tests/pages.test.mjs` guards the parts that silently rot: the consent surface on
every page, a self-canonical per indexable page, the category phrase on
`/webmcp-agent-skill/`, that the start and documentation pages form a linked
tree, that every public route remains in the sitemap, and that every `FAQPage`
schema answer still exists in the visible copy of its page.

Production: https://webmcpify.at

Google Analytics 4 measurement is documented in
[`ANALYTICS.md`](ANALYTICS.md). It is live behind a two-category consent
banner (Statistics / Marketing); the compliance record lives in
[`docs/LEGAL_COMPLIANCE_PLAN.md`](docs/LEGAL_COMPLIANCE_PLAN.md).

Run its dependency-free contract tests with `node --test 'tests/*.test.mjs'`.
## Development

## Agent surface
After editing `index.html`, regenerate and commit the German page:

The site is itself agent-ready, in the three layers a WebMCP integration can have:
```sh
python3 build-de.py
```

- **Imperative** — `webmcp/tools.js` holds the tool contracts (`get_install_command`,
`get_pipeline_overview`, `get_faq`, `set_language`) as pure data;
`webmcp/site-tools.js` registers them via `document.modelContext` with the
vendored runtime (`webmcp/webmcpify.js`).
- **Declarative** — the install form (`#install-picker`) carries `toolname`,
`tooldescription`, `toolautosubmit` and a `required` select with
`toolparamdescription`, so `show_install_command` exists without JavaScript
registration. Agents and humans go through the same submit handler; without
scripting the control row is hidden and every install route is listed as text.
- **Pre-visit discovery** — [`.well-known/webmcp.json`](.well-known/webmcp.json),
served at `/.well-known/webmcp` (nginx alias, `application/json`) and advertised
from every page via `<link rel="webmcp">` plus an RFC 8288 `Link` response header.
The WebMCP spec defines **no** manifest format; this follows the de-facto shape
third-party crawlers and inspectors probe. Runtime registration stays
authoritative: the manifest is **generated** — run `node build-manifest.mjs` and
commit the result after changing any tool contract; the tests fail if the
committed file is stale or disagrees with the form.
After changing a tool contract, regenerate and commit the discovery manifest:

## Deploy
```sh
node build-manifest.mjs
```

Run the dependency-free contract tests with:

Merging to `main` deploys automatically. `.github/workflows/site.yml` runs the contract
tests and the generated-file check on every PR, then on every push to `main`:
```sh
node --test 'tests/*.test.mjs'
```

1. pulls `main` into the docroot on the host through a restricted deploy key, whose
forced command only runs `git pull --ff-only` and prints the deployed `HEAD`;
2. fails unless the deployed commit contains the pushed one;
3. verifies `https://webmcpify.at/` (200 + HSTS) and every public route.
## Agent surface

The site is itself agent-ready, in the three layers a WebMCP integration can have:

Host: `tuejon.at`, docroot `/opt/webmcpify` (clone of `main`, no build step), nginx vhost
`/etc/nginx/sites-available/25-webmcpify.conf` (TLS via Let's Encrypt/certbot,
http→https and www→apex 301s, HSTS). Jobs run on the repo's self-hosted `tuejon-ci`
runner and skip pull requests from forks.
- **Imperative** — tool contracts in `webmcp/tools.js` are registered through
`document.modelContext` by `webmcp/site-tools.js`.
- **Declarative** — the install form exposes an equivalent tool through HTML
attributes and keeps the same workflow available without scripting.
- **Pre-visit discovery** — [`.well-known/webmcp.json`](.well-known/webmcp.json)
advertises the available tools to compatible crawlers and inspectors.

## Deploy

Manual fallback (same effect as the pipeline): `ssh tj@tuejon.at 'cd /opt/webmcpify && git pull --ff-only'`.
Pull requests run the contract tests and generated-file checks. Merges to `main`
deploy automatically and verify the public routes.
Loading