# MCP Server: Legifrance JORF (Journal Officiel) for AI Agents (`dltik/mcp-server-legifrance`) Actor

Apify MCP server exposing 6 tools to query the French Journal Officiel (JORF) - laws, decrees, arretes, decisions - via DILA Open Data. AI agents ready. No API key needed. $0.01 per tool call.

- **URL**: https://apify.com/dltik/mcp-server-legifrance.md
- **Developed by:** [dltik](https://apify.com/dltik) (community)
- **Categories:** Developer tools, Business, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 tool calls

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Legifrance MCP Server - French Journal Officiel (JORF) for AI Agents (Laws, Decrees, Arretes)

> Apify-hosted **Legifrance MCP server** giving AI agents live access to the French Journal Officiel (JORF) - laws, decrees, arretes, decisions - backed by the free official **DILA Open Data** feed (`echanges.dila.gouv.fr/OPENDATA/JORFSIMPLE/`). 6 tools, no API key, no proxy, no OAuth. **$0.01 per tool call**.

Bookmark this Legifrance MCP Server - Apify ranks actors by bookmarks, so it directly helps this server stay visible on the Apify Store.

### What is the Legifrance MCP Server?

The **Legifrance MCP Server** is an Apify actor implementing the [Model Context Protocol](https://modelcontextprotocol.io/) for the French [Journal Officiel](https://www.legifrance.gouv.fr/), the official daily publication of every French law, decree, ministerial arrete, decision and circulaire. This MCP server fetches the daily JORF archives published by [DILA](https://www.dila.premier-ministre.gouv.fr/) (Direction de l'information legale et administrative) and exposes 6 tools that your AI agent can call directly.

Wire it into Claude Desktop, Cursor, or Continue.dev to give your agent live read access to French primary legal sources - search a JORF issue, fetch a specific decree, list every law promulgated in the past month.

### Why this exists (Light Legifrance)

The full [PISTE Legifrance API](https://api.piste.gouv.fr/) requires manually registering a free OAuth2 client (cannot be done headlessly, gates the use case for agents). This actor takes the same primary source - the official DILA JORF dumps - and serves it through a simple MCP interface. The data is identical: laws, decrees, arretes published in the Journal Officiel of the French Republic.

Coverage: the rolling ~10 most recent months of JORF (DILA's retention window for the public open-data feed). For older archives, use the static historical dumps on data.gouv.fr.

### Use cases

- **Legal-research agents** - "Find the JORF entry for LOI n.2026-381 of 19 May 2026"
- **Compliance monitoring** - daily scan of new arretes from `Ministere du travail` affecting payroll
- **Public-sector intelligence** - "Has any decree been signed in the last 14 days mentioning `transition ecologique`?"
- **Government-contract teams** - cross-reference JORF dates with [BOAMP](https://apify.com/dltik/boamp-fr-scraper) tender publications
- **Newsroom / journalism bots** - feed the latest LOI promulgations into a daily summary pipeline

### Tools available

| Tool | What it returns |
| --- | --- |
| `list_jorf_days(days)` | Which calendar dates have an available JORF archive (rolling window). |
| `get_jorf_summary(date)` | Table of contents + per-nature counts for one JORF issue. |
| `search_jorf(date, query, limit)` | Full-text search within one JORF day (title + visas + notice + body). |
| `get_jorf_text(date, text_id)` | Full text of a specific JORF entry by `JORFTEXT...` id. |
| `list_recent_laws(days, nature, limit)` | List recent LOI / DECRET / ARRETE / DECISION across N days. |
| `search_text_id(text_id)` | Locate a JORFTEXT id by scanning recent days. |
| `list_tools` | Free - schema discovery. |

### Input

```json
{
  "mode": "call_tool",
  "tool_name": "search_jorf",
  "arguments": { "date": "2026-05-19", "query": "transition ecologique", "limit": 10 }
}
````

### Output (sample)

```json
{
  "id": "JORFTEXT000054113360",
  "nature": "LOI",
  "title": "LOI n. 2026-381 du 19 mai 2026 visant a soutenir les collectivites territoriales dans la prevention et la gestion des inondations",
  "num": "2026-381",
  "nor": "TECX2506131L",
  "date_publi": "2026-05-20",
  "date_texte": "2026-05-19",
  "ministere": null,
  "id_eli": "https://www.legifrance.gouv.fr/eli/loi/2026/5/19/TECX2506131L/jo/texte",
  "legifrance_url": "https://www.legifrance.gouv.fr/eli/loi/2026/5/19/TECX2506131L/jo/texte",
  "body_excerpt": "L'Assemblee nationale et le Senat ont adopte. Le President de la Republique promulgue la loi dont la teneur suit ..."
}
```

### Pricing

**PAY\_PER\_EVENT - $0.01 per tool call** (= $10 per 1,000 calls). The `list_tools` discovery call is free. No charge on errors. Result count does not affect the charge - one tool call is one charge.

### FAQ

**What's the latency on new JORF entries?** DILA publishes the daily JORFSIMPLE archive a few hours after the Journal Officiel comes out (typically the same evening or the next morning). This MCP server reads the live index, so new days appear automatically.

**Does this cover the full Code du travail / Code civil?** No - only the *JORF* (the daily Journal Officiel containing newly published / modified texts). For consolidated codes you would need PISTE OAuth access. JORF gives you the primary law as published, which is the canonical source.

**Why is the coverage limited to ~10 months?** That's the rolling window DILA keeps live on `echanges.dila.gouv.fr`. For historical archives back to 1990, see the bulk dump on [data.gouv.fr](https://www.data.gouv.fr/datasets/jorf-les-donnees-de-l-edition-lois-et-decrets-du-journal-officiel/).

**Why MCP and not just a scraper?** An MCP server lets your AI agent chain queries naturally: "List recent LOI, then fetch the full text of the first one, then search the day's JORF for related decrees." For one-shot bulk extraction, [BOAMP Scraper](https://apify.com/dltik/boamp-fr-scraper) (tender announcements) and [BODACC MCP Server](https://apify.com/dltik/mcp-server-bodacc) (commercial court) make a strong FR public-data triad with this actor.

***

Found this useful? Bookmark this Legifrance MCP Server - it's the strongest signal for Apify Store ranking.

#### Related actors

- [BODACC MCP Server](https://apify.com/dltik/mcp-server-bodacc) - 4.5M French commercial court announcements
- [Pappers MCP Server](https://apify.com/dltik/mcp-server-pappers) - 26M French companies (SIREN/SIRET, dirigeants, NAF)
- [INPI MCP Server](https://apify.com/dltik/mcp-server-inpi) - French trademark + patent registry
- [Data Gouv FR MCP Server](https://apify.com/dltik/mcp-server-data-gouv) - DPE / DVF / BAN / INSEE
- [BOAMP FR Scraper](https://apify.com/dltik/boamp-fr-scraper) - French public-tender announcements

License: MIT - Author: [dltik](https://apify.com/dltik)

# Actor input Schema

## `mode` (type: `string`):

list\_tools (free, returns tool catalog) or call\_tool (charged $0.01 per call).

## `tool_name` (type: `string`):

Tool to invoke. Use mode=list\_tools to discover the full schema of each tool.

## `arguments` (type: `object`):

Arguments for the chosen tool (e.g. date, query, text\_id). See list\_tools mode for the per-tool schema.

## Actor input object example

```json
{
  "mode": "call_tool",
  "tool_name": "list_jorf_days",
  "arguments": {
    "days": 7
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "arguments": {
        "days": 7
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dltik/mcp-server-legifrance").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "arguments": { "days": 7 } }

# Run the Actor and wait for it to finish
run = client.actor("dltik/mcp-server-legifrance").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "arguments": {
    "days": 7
  }
}' |
apify call dltik/mcp-server-legifrance --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=dltik/mcp-server-legifrance",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "MCP Server: Legifrance JORF (Journal Officiel) for AI Agents",
        "description": "Apify MCP server exposing 6 tools to query the French Journal Officiel (JORF) - laws, decrees, arretes, decisions - via DILA Open Data. AI agents ready. No API key needed. $0.01 per tool call.",
        "version": "1.0",
        "x-build-id": "tC6G4EuTbGGTh52zb"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/dltik~mcp-server-legifrance/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-dltik-mcp-server-legifrance",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/dltik~mcp-server-legifrance/runs": {
            "post": {
                "operationId": "runs-sync-dltik-mcp-server-legifrance",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/dltik~mcp-server-legifrance/run-sync": {
            "post": {
                "operationId": "run-sync-dltik-mcp-server-legifrance",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "call_tool",
                            "list_tools"
                        ],
                        "type": "string",
                        "description": "list_tools (free, returns tool catalog) or call_tool (charged $0.01 per call).",
                        "default": "call_tool"
                    },
                    "tool_name": {
                        "title": "Tool name",
                        "enum": [
                            "list_jorf_days",
                            "get_jorf_summary",
                            "search_jorf",
                            "get_jorf_text",
                            "list_recent_laws",
                            "search_text_id"
                        ],
                        "type": "string",
                        "description": "Tool to invoke. Use mode=list_tools to discover the full schema of each tool.",
                        "default": "list_jorf_days"
                    },
                    "arguments": {
                        "title": "Arguments",
                        "type": "object",
                        "description": "Arguments for the chosen tool (e.g. date, query, text_id). See list_tools mode for the per-tool schema."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
