Skip to main content
Glama
zohar

Knesset MCP Server

by zohar
README.md
# Knesset MCP Server

A Model Context Protocol (MCP) server for accessing the Israeli Knesset's parliamentary information API. Exposes a focused set of tools so AI assistants like Claude can query bills, committees, and members from the Knesset OData service.

## Requirements

- Node.js **>= 20.10.0** (older versions fail with `SELF_SIGNED_CERT_IN_CHAIN` against `knesset.gov.il`)

## Installation

```bash
git clone https://github.com/yourusername/knesset-mcp-server.git
cd knesset-mcp-server
npm install
npm run build
```

## Usage

### Running the server

```bash
npm start       # run the built server
npm run dev     # run TypeScript directly via ts-node
```

### Using with Claude Desktop

1. Install [Claude Desktop](https://claude.ai/download).
2. Edit your Claude Desktop configuration at `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):

```json
{
  "mcpServers": {
    "knesset": {
      "command": "npx",
      "args": ["-y", "knesset-mcp"]
    }
  }
}
```

3. Restart Claude Desktop — the Knesset tools will be available.

The `npx -y` flag auto-installs the package on first run and caches it. Requires Node.js >= 20.10.0.

## Tools

### Bills

- `get-bill-info` — Detailed info for a bill by `BillID`, including initiators.
- `search-bills-by-name` — Keyword search over bill names (up to 20 most recent matches). Optional `knessetNum` filter.
- `list-bills-by-status` — Bills filtered by a raw `StatusID` from `KNS_Status`, ordered by `LastUpdatedDate` desc.
- `list-recent-bills-by-stage` — Bills at a named legislative stage:
  `first-reading-approved`, `first-reading-plenum`, `second-third-approved`, `second-third-plenum`, `third-reading-plenum`, `passed`.
  Note: the Knesset combines 2nd and 3rd readings into one vote, so `second-third-approved` is the closest proxy to "passed second reading"; `passed` means the bill became law.
- `list-bills-by-type` — Bills by origin: `private`, `government`, or `committee`. Optional `knessetNum`.

### Committees

- `get-committee-info` — Committee details by `CommitteeID`.
- `list-committees` — Committees for a given Knesset number, with optional `onlyCurrent` filter.

### Members & Factions

- `list-factions` — Lists parties (factions) in a given Knesset. Use this first to find the `FactionID` of the party you care about. Optional `onlyCurrent` filter to exclude factions that have disbanded or merged.
- `list-knesset-members` — Lists Knesset members (MKs) with their party affiliation. Optional `factionId` filter returns only members of a specific party (pair with `list-factions` to discover IDs). Optional `onlyCurrent` filter limits results to active memberships.

**How to get a party's MK roster:**

1. Call `list-factions` with the Knesset number → find the `FactionID` of the party.
2. Call `list-knesset-members` with that `knessetNum` and `factionId` → get the member list.

Note: an MK who switched parties mid-term appears once per stint. Pass `onlyCurrent: true` to see only the active membership.

## Example prompts

Sample prompts in Hebrew you can try once the server is wired up. Each one exercises a specific tool or combination of tools.

### Single-tool prompts

**`list-factions`**
- "אילו סיעות פעילות כיום בכנסת ה-25?"
- "תראה לי את כל הסיעות שהיו בכנסת ה-24, כולל כאלה שהתפצלו או התאחדו."

**`list-knesset-members`**
- "מי חברי סיעת הליכוד בכנסת הנוכחית?"
- "תן לי את רשימת כל חברי הכנסת המכהנים כרגע בכנסת ה-25."

**`list-committees`**
- "אילו ועדות פעילות היום בכנסת?"
- "מה הן כל הוועדות שפעלו בכנסת ה-24?"

**`get-committee-info`**
- "תן לי פרטים על ועדת הכספים."
- "מה המידע על הוועדה עם המזהה 2010?"

**`search-bills-by-name`**
- "חפש הצעות חוק שמכילות את המילה 'פנסיה'."
- "מצא הצעות חוק על 'דיור ציבורי' בכנסת ה-25."

**`list-bills-by-type`**
- "תראה לי את הצעות החוק הממשלתיות האחרונות בכנסת ה-25."
- "מה הן 20 הצעות החוק הפרטיות העדכניות ביותר?"

**`list-bills-by-status`**
- "אילו הצעות חוק עברו בקריאה שלישית לאחרונה (סטטוס 118)?"
- "תן לי את הצעות החוק שאושרו בוועדה לקריאה שנייה ושלישית בכנסת ה-25."

**`list-recent-bills-by-stage`**
- "אילו חוקים עברו ונכנסו לספר החוקים לאחרונה?"
- "תן לי את ההצעות שאושרו בקריאה ראשונה בכנסת הנוכחית."

**`get-bill-info`**
- "תן לי את כל הפרטים והיוזמים של הצעת החוק עם המזהה 2145694."
- "מי יזם את הצעת החוק הזו ומה הסטטוס הנוכחי שלה? (BillID: ...)"

### Multi-tool prompts

**Two tools**
- "תראה לי את כל הסיעות החרדיות בכנסת ה-25, ואז פרט את חברי הכנסת של 'יהדות התורה'." → `list-factions` + `list-knesset-members`
- "חפש הצעות חוק על 'אלימות במשפחה' בכנסת הנוכחית, ואז תן לי את הפרטים המלאים והיוזמים של הכי רלוונטית." → `search-bills-by-name` + `get-bill-info`
- "תראה לי את כל הוועדות הפעילות בכנסת, ואז תן לי את המידע המפורט על ועדת החוקה." → `list-committees` + `get-committee-info`
- "אילו חוקים עברו בקריאה שלישית לאחרונה? בחר את 3 החשובים ביותר ותן לי פרטים על כל אחד." → `list-recent-bills-by-stage` + `get-bill-info`

**Three tools**
- "מצא את הסיעה 'יש עתיד' בכנסת ה-25, ראה מי חבריה, ואז חפש הצעות חוק שמזכירות אחד מהם בשם — בחר את מרב מיכאלי לדוגמה." → `list-factions` + `list-knesset-members` + `search-bills-by-name`
- "תראה לי 10 הצעות חוק ממשלתיות אחרונות ו-10 הצעות פרטיות אחרונות, ואז פרט את ההצעה הפרטית שהכי מתקדמת בתהליך החקיקה." → `list-bills-by-type` (×2) + `get-bill-info`
- "חפש הצעות חוק על 'תחבורה ציבורית', סנן את אלו שאושרו לקריאה ראשונה (סטטוס 109), ותן לי פרטים על הפעילה ביותר." → `search-bills-by-name` + `list-bills-by-status` + `get-bill-info`

**Four or more tools**
- "צור לי פרופיל שלם של סיעת 'העבודה' בכנסת ה-25: רשימת החברים, באילו ועדות הם פעילים, ודוגמה להצעת חוק שהם יזמו. התחל ממציאת מזהה הסיעה." → `list-factions` + `list-knesset-members` + `list-committees` + `search-bills-by-name` + `get-bill-info`
- "הכן לי סיכום חקיקה: 5 חוקים שעברו לאחרונה, 5 הצעות שאושרו לקריאה שנייה-שלישית, ו-5 הצעות שאושרו לקריאה ראשונה — עבור הכנסת הנוכחית. עבור החוק החשוב ביותר שעבר, תן לי את הפרטים המלאים." → `list-recent-bills-by-stage` (×3) + `get-bill-info`
- "אני מתעניין בחקיקת סביבה. חפש הצעות חוק על 'אקלים' ו'זיהום', תן לי פרטים על כל אחת כולל היוזמים, ובדוק לאיזו סיעה משתייך כל יוזם — האם זה חוצה קואליציה/אופוזיציה?" → `search-bills-by-name` + `get-bill-info` + `list-factions` + `list-knesset-members`

## API

Backed by the Knesset OData service at:

```
https://knesset.gov.il/Odata/ParliamentInfo.svc
```

Ordering uses `LastUpdatedDate` because the OData API does not expose per-stage transition dates on `KNS_Bill`.

## Development

For ad-hoc testing of the server you can use the [MCP Inspector](https://github.com/modelcontextprotocol/inspector):

```bash
npx @modelcontextprotocol/inspector node build/knesset-mcp-server.js
```

A minimal smoke test is included:

```bash
node test-mcp.mjs
```

## License

MIT

TDQS

A3.7/5.0

Scored across 9 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: get-bill-info and get-committee-info target single entities; list-bills-by-status, list-bills-by-type, and list-recent-bills-by-stage provide different filtering; list-committees, list-factions, list-knesset-members each cover specific lists; search-bills-by-name is a keyword search. No overlap causes confusion.

Naming Consistency5/5

All tool names follow a verb_noun_with_hyphens pattern. 'get-' is used for single-item retrieval, 'list-' for multiple items, and 'search-' for keyword search. The pattern is consistent and predictable across all 9 tools.

Tool Count5/5

9 tools is appropriate for a parliamentary data server. It covers the main entities (bills, committees, factions, members) without being overwhelming or too sparse.

Completeness4/5

The tool set covers core CRUD-like queries (read-only) for bills, committees, factions, and members. Minor gaps include no dedicated get-faction or get-member tool, but list endpoints with filters largely fill these needs.

Maintenance

ActivityInactive
ResponsivenessWithin a week