Footlambert MCP
Footlambert exposes a public, read-only Model Context Protocol (MCP) endpoint for Paris theater, movie, showtime, and retrospective data.
Endpoint
https://seance.paris/mcp
Transport: Streamable HTTP. Protocol version: 2025-06-18.
All tools are read-only and intended for query use.
Discovery
- MCP endpoint:
https://seance.paris/mcp - Human docs:
https://seance.paris/mcp-docs - LLM index:
https://seance.paris/llms.txt - Metadata probe:
GET /mcp
HTTP Requirements
- Initialize with
POST /mcpand JSON-RPCinitialize. - Send
Accept: application/json, text/event-streamfor MCP POST requests. - Send
Mcp-Session-Idon all follow-up requests after initialize. - Send
MCP-Protocol-Version: 2025-06-18after initialize. - Close sessions with
DELETE /mcp.
Canonical IDs
theater:<slug>movie:wikidata:<QID>movie:slug:<slug>person:<role>:<id>date:<yyyy-mm-dd>
Data Source
The endpoint serves data from the production Footlambert snapshot published to DigitalOcean Spaces and refreshed multiple times per day.
Notes
- No mutation tools are exposed.
- Movie responses use Wikidata-oriented IDs and do not expose IMDb IDs.
- Showtime timestamps are normalized to ISO-8601 values in the Europe/Paris timezone.
- Responses may be rate-limited for abuse protection.
Tools
search: argsquery, type?, date?, limit?. Result list across theaters/movies/people/showtimes.fetch: argsid. Canonical entity payload by ID (theater/movie/person/date).get_theater: argsslug_or_name. Theater details + showtimes grouped by date.get_movie: argsmovie_id_or_slug. Movie details + showtimes grouped by theater.get_showtimes: argsdate?, theater_slug?, movie?, movie_id?, limit?. Flat showtime events with Paris-normalized times.get_retrospectives: argsrole?, person?, limit?. Retrospective buckets for directors/writers/cast.get_person: argsid_or_name, role?. Person details + associated movies + showtimes by date.
Initialize Example
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": { "name": "example-client", "version": "1.0.0" }
}
}Tool Call Example
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_showtimes",
"arguments": { "date": "2026-02-18", "limit": 2 }
}
}Response Contract
- Success:
{ result: { content: [...], structuredContent: {...} } } - Tool error:
{ result: { isError: true, content: [...], structuredContent: { error } } }
Endpoint Return Examples
GET /mcp (metadata probe, no session)
Request:
curl -s https://seance.paris/mcpResponse:
{
"name": "footlambert-mcp",
"version": "1.0.0",
"protocol_version": "2025-06-18",
"transport": "streamable-http",
"endpoint": "https://seance.paris/mcp",
"docs": "https://seance.paris/mcp-docs",
"llms": "https://seance.paris/llms.txt",
"tools": ["search", "fetch", "get_theater", "get_movie", "get_showtimes", "get_retrospectives", "get_person"],
"canonical_ids": {
"theater": "theater:<slug>",
"movie": ["movie:wikidata:<QID>", "movie:slug:<slug>"],
"person": "person:<role>:<id>",
"date": "date:<YYYY-MM-DD>"
},
"time_policy": {
"timezone": "Europe/Paris",
"format": "ISO-8601 with Paris UTC offset"
}
}POST /mcp initialize (JSON-RPC)
Request:
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": { "name": "example-client", "version": "1.0.0" }
}
}Response:
{
"result": {
"protocolVersion": "2025-06-18",
"capabilities": { "logging": {}, "tools": { "listChanged": true } },
"serverInfo": { "name": "footlambert-mcp", "version": "1.0.0" }
},
"jsonrpc": "2.0",
"id": 1
}
// HTTP response header includes: Mcp-Session-Id: <uuid>DELETE /mcp (close session)
Request:
curl -X DELETE https://seance.paris/mcp -H "Mcp-Session-Id: <session-id>"Response:
HTTP 200 with empty bodyPOST /mcp tool call without session
Request:
{
"jsonrpc": "2.0",
"id": 12,
"method": "tools/call",
"params": { "name": "search", "arguments": { "query": "mk2" } }
}Response:
{
"jsonrpc": "2.0",
"error": {
"code": -32000,
"message": "No active MCP session. Start with an initialize request or include a valid mcp-session-id header."
},
"id": null
}GET /mcp with Accept: text/event-stream but no session
Request:
curl -H "Accept: text/event-stream" https://seance.paris/mcpResponse:
HTTP 405
{
"error": "Sessionless GET event streams are not supported. Initialize with POST /mcp first and send Mcp-Session-Id on follow-up requests."
}Tool Output Examples
search
Tool call params:
{
"name": "search",
"arguments": { "query": "godard", "type": "all", "limit": 2 }
}result.structuredContent sample:
{
"query": "godard",
"type": "all",
"date": null,
"total_results": 2,
"results": [
{ "id": "movie:wikidata:Q86427", "type": "movie", "title": "Breathless" },
{ "id": "person:directors:Q53001", "type": "person", "title": "Jean-Luc Godard" }
]
}fetch
Tool call params:
{
"name": "fetch",
"arguments": { "id": "theater:mk2-beaubourg" }
}result.structuredContent sample:
{
"id": "theater:mk2-beaubourg",
"type": "theater",
"theater": {
"name": "MK2 Beaubourg",
"address": "50 Rue Rambuteau",
"website": "https://www.mk2.com/salle/mk2-beaubourg",
"location": { "latitude": 48.861555, "longitude": 2.352217 }
},
"showtimes_by_date": { "2026-02-18": [ ... ] }
}get_theater
Tool call params:
{
"name": "get_theater",
"arguments": { "slug_or_name": "mk2-beaubourg" }
}result.structuredContent sample:
{
"id": "theater:mk2-beaubourg",
"theater": {
"name": "MK2 Beaubourg",
"address": "50 Rue Rambuteau",
"phone": "0 892 69 84 84",
"cards": { "ugc": true, "pathe": false, "mk2": null }
},
"showtimes_by_date": { "2026-02-18": [ ... ] }
}get_movie
Tool call params:
{
"name": "get_movie",
"arguments": { "movie_id_or_slug": "movie:wikidata:Q86427" }
}result.structuredContent sample:
{
"id": "movie:wikidata:Q86427",
"movie": {
"wikidata_qid": "Q86427",
"title": "Breathless",
"director": "Jean-Luc Godard",
"year": "1960"
},
"showtimes_by_theater": { "filmotheque-du-quartier-latin": { "dates": { ... } } }
}get_showtimes
Tool call params:
{
"name": "get_showtimes",
"arguments": { "date": "2026-02-18", "limit": 2 }
}result.structuredContent sample:
{
"filters": { "date": "2026-02-18", "theater_slug": null, "movie": null },
"total_results": 2,
"showtimes": [
{
"date": "2026-02-18",
"timezone": "Europe/Paris",
"times": [{ "iso": "2026-02-18T10:30:00+01:00", "label": "10:30" }]
}
]
}get_retrospectives
Tool call params:
{
"name": "get_retrospectives",
"arguments": { "role": "directors", "limit": 2 }
}result.structuredContent sample:
{
"role": "directors",
"person_filter": null,
"total_results": 2,
"entries": [
{ "canonical_id": "person:directors:Q51547", "label": "Billy Wilder", "movie_count": 11 },
{ "canonical_id": "person:directors:Q189526", "label": "Brian De Palma", "movie_count": 8 }
]
}get_person
Tool call params:
{
"name": "get_person",
"arguments": { "id_or_name": "Jean-Luc Godard", "role": "directors" }
}result.structuredContent sample:
{
"person": {
"canonical_id": "person:directors:Q53001",
"label": "Jean-Luc Godard",
"movie_count": 4
},
"movies": [{ "id": "movie:wikidata:Q86427", "title": "Breathless" }],
"showtimes_by_date": { "2026-02-18": [ ... ] }
}