feat: trips-only chatbot MCP endpoint without editorial website text
This commit is contained in:
1 parent
9f805aaec7
commit
26d4140c18
7 files changed
+110
-11
No files matched your search
+20
-2
@@ -13,7 +13,8 @@ TYPO3 sends no dates or prices, and nothing flows back to TYPO3.
|
||||
## Endpoint
|
||||
|
||||
`POST /mcp` (Streamable HTTP; `GET`/`DELETE` are part of the transport), served by `symfony/mcp-bundle`
|
||||
from `config/packages/mcp.yaml`. Tools only, no resources or prompts.
|
||||
from `config/packages/mcp.yaml`. Tools only, no resources or prompts. `POST /mcp/trips` is the same
|
||||
server without the editorial content, see [Trips only](#trips-only-mcptrips).
|
||||
|
||||
Authentication is a static bearer token per client, `Authorization: Bearer <token>`, checked by
|
||||
`App\Security\McpAccessTokenHandler` on the `mcp` firewall. `APP_MCP_TOKENS` lists the clients as
|
||||
@@ -44,6 +45,23 @@ that prices and availability are a snapshot (`dataAsOf`) and only the booking pa
|
||||
| `search_content` | Questions not about dates or prices | Up to 8 hits with a ~600-character excerpt |
|
||||
| `get_document` | The full text of one `search_content` hit, by `url` | Markdown body, truncated at 20 000 characters |
|
||||
|
||||
### Trips only: `/mcp/trips`
|
||||
|
||||
A second server (`chatbot_trips` in `config/packages/mcp.yaml`) for clients that must not answer from
|
||||
editorial website text, which can contradict the booking system, most visibly on prices. A client picks
|
||||
the variant by the path it is pointed at; tokens, rate limit and log are those of `/mcp`.
|
||||
|
||||
- Only `search_trips` and `get_trip`. `search_content` and `get_document` do not exist here.
|
||||
- `get_trip` (`App\Chatbot\Mcp\TripsOnly\GetTripTool`) leaves out the product `description`, which
|
||||
includes the FAQs, and each hotel's `description`.
|
||||
- What remains from TYPO3 is structured: trip and hotel names, `url`, `site`, destination, concept and
|
||||
the hotel `facts` (beds, altitude, distances, sauna, wifi, …; no prices). Which trips exist is still
|
||||
decided by TYPO3's products and their `searchable` flag, and the free-text `query` of `search_trips`
|
||||
still matches page text to find a trip, without returning any of it.
|
||||
- The server instructions tell the model to refer to the trip's `url` for anything the tools don't answer.
|
||||
|
||||
To give a client the editorial content back, point it at `/mcp` again.
|
||||
|
||||
Editorial text (product descriptions, FAQs, pages) is maintained by hand in TYPO3 and can lag behind BusPro, e.g. an
|
||||
old price or a changed inclusion. The server instructions and the tool descriptions therefore tell the model that the
|
||||
structured trip fields of `search_trips` and `get_trip` override whatever the text says about dates, prices, pickups
|
||||
@@ -152,4 +170,4 @@ After a complete run that changed something, the codes the trip join cannot plac
|
||||
|---|---|
|
||||
| `APP_CMS_API_BASE_URL` | TYPO3 base URL per stage (also used by `CmsDataProvider`) |
|
||||
| `APP_CMS_API_KEY` | TYPO3 `X-Api-Key`: the content feed and its `contentUrl` pages, and `typo3.client` (`CmsDataProvider`) |
|
||||
| `APP_MCP_TOKENS` | Bearer tokens for `/mcp`, one per client: `name:token,name:token` |
|
||||
| `APP_MCP_TOKENS` | Bearer tokens for `/mcp` and `/mcp/trips`, one per client: `name:token,name:token` |
|
||||
Reference in new issue
Block a user