Skip to main content
Glama

๐Ÿค– Notion Agent Hub

AI Agent Hub for Notion โ€” orchestrate AI agents through Notion databases with human-in-the-loop approval. Built with MCP.

Notion MCP TypeScript Node License CI

Turn your Notion workspace into an AI command center.

Quick Start ยท Architecture ยท Tools ยท Agents ยท Setup Guide


โœจ What It Does

Notion Agent Hub is an MCP (Model Context Protocol) server that connects AI assistants (Claude, GPT, etc.) to your Notion workspace. It provides:

  1. ๐Ÿ” Research Agent โ€” Search the web, compile findings, and write structured research pages to Notion

  2. ๐Ÿ”„ GitHub Tracker โ€” Monitor GitHub PRs and sync their status to a Notion database

  3. ๐Ÿ“ Content Pipeline โ€” Read outlines from Notion, generate drafts, and submit for human review

All tasks flow through a Notion-native task queue with human-in-the-loop approval โ€” you stay in control.

Related MCP server: Notion MCP Server

๐Ÿ— Architecture

graph TB
    subgraph "AI Assistant"
        C[Claude / GPT / etc.]
    end

    subgraph "MCP Server โ€” notion-agent-hub"
        direction TB
        S[Server Entry Point]

        subgraph "Tools Layer"
            NR[๐Ÿ“– notion-read]
            NW[โœ๏ธ notion-write]
            NQ[๐Ÿ”Ž notion-query]
            WS[๐ŸŒ web-search]
            CR[๐Ÿ’ป code-run]
        end

        subgraph "Agent Layer"
            RA[๐Ÿ”ฌ Research]
            GT[๐Ÿ”„ GitHub Tracker]
            CP[๐Ÿ“ Content Pipeline]
        end

        TQ[๐Ÿ“‹ Task Queue]
    end

    subgraph "Your Notion Workspace"
        TD[(Task Database)]
        RP[Research Pages]
        DP[Draft Pages]
        PR[(PR Tracker DB)]
    end

    C <-->|MCP Protocol| S
    S --> NR & NW & NQ & WS & CR
    TQ -->|Poll| TD
    RA -->|Write| RP
    GT -->|Sync| PR
    CP -->|Write| DP
    TD -->|Human creates tasks| TQ

For a deeper dive, see docs/architecture.md.

๐Ÿ“ Project Structure

notion-agent-hub/
โ”œโ”€โ”€ .github/
โ”‚   โ””โ”€โ”€ workflows/
โ”‚       โ””โ”€โ”€ ci.yml              # CI: type-check + tests (Node 22)
โ”œโ”€โ”€ docs/
โ”‚   โ”œโ”€โ”€ architecture.md         # System architecture & data flow
โ”‚   โ”œโ”€โ”€ setup.md                # Detailed setup guide
โ”‚   โ””โ”€โ”€ images/                 # Diagrams
โ”œโ”€โ”€ scripts/                    # Standalone agent test scripts
โ”‚   โ”œโ”€โ”€ test-research.ts
โ”‚   โ”œโ”€โ”€ test-github-tracker.ts
โ”‚   โ””โ”€โ”€ test-content-pipeline.ts
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ index.ts                # MCP server entry point (stdio)
โ”‚   โ”œโ”€โ”€ agents/                 # Higher-level agent workflows
โ”‚   โ”‚   โ”œโ”€โ”€ research.ts
โ”‚   โ”‚   โ”œโ”€โ”€ github-tracker.ts
โ”‚   โ”‚   โ””โ”€โ”€ content-pipeline.ts
โ”‚   โ”œโ”€โ”€ queue/
โ”‚   โ”‚   โ””โ”€โ”€ task-queue.ts       # Notion-native human-in-the-loop queue
โ”‚   โ”œโ”€โ”€ tools/                  # MCP tool implementations
โ”‚   โ”‚   โ”œโ”€โ”€ notion-read.ts
โ”‚   โ”‚   โ”œโ”€โ”€ notion-write.ts
โ”‚   โ”‚   โ”œโ”€โ”€ notion-query.ts
โ”‚   โ”‚   โ”œโ”€โ”€ web-search.ts
โ”‚   โ”‚   โ””โ”€โ”€ code-run.ts
โ”‚   โ””โ”€โ”€ utils/
โ”‚       โ”œโ”€โ”€ notion-client.ts    # Shared Notion API client
โ”‚       โ””โ”€โ”€ logger.ts
โ”œโ”€โ”€ tests/                      # Vitest unit tests for tools
โ”œโ”€โ”€ .env.example                # Environment variable template
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ tsconfig.json
โ””โ”€โ”€ LICENSE                     # MIT

๐Ÿš€ Quick Start

Prerequisites

  • Node.js 22+

  • A Notion account with API access

  • A Notion integration (API key)

1. Clone & Install

git clone https://github.com/girishlade111/notion-agent-hub.git
cd notion-agent-hub
npm install

2. Configure

cp .env.example .env

Edit .env with your keys:

NOTION_API_KEY=ntn_your_integration_secret
NOTION_DATABASE_ID=your_task_database_id
OPENAI_API_KEY=sk-your_openai_key  # Optional

๐Ÿ“– See the Setup Guide for detailed instructions on creating a Notion integration and task database.

3. Build & Run

npm run build
npm start

4. Connect to Claude Desktop

Add to your Claude Desktop config:

{
  "mcpServers": {
    "notion-agent-hub": {
      "command": "node",
      "args": ["/path/to/notion-agent-hub/dist/index.js"],
      "env": {
        "NOTION_API_KEY": "ntn_your_key",
        "NOTION_DATABASE_ID": "your_db_id"
      }
    }
  }
}

๐Ÿ›  Tools

notion-read

Read pages, databases, and blocks from Notion.

Input:  { page_id?: string, database_id?: string, block_id?: string }
Output: Page content with properties and child blocks

notion-write

Create or update Notion pages with rich content.

Input:  { action: "create" | "update" | "append", parent_id?, page_id?, title?, blocks? }
Output: { id, url, created/updated/appended: true }

Supported block types: paragraph, heading_1/2/3, bulleted_list_item, numbered_list_item, toggle, quote, callout, divider, code

notion-query

Query databases with filters and sorting.

Input:  { database_id, filter?, sorts?, page_size? }
Output: { results: [...pages], has_more, next_cursor }

Search the web using Brave Search (or DuckDuckGo fallback).

Input:  { query: string, count?: number }
Output: { results: [{ title, url, snippet }], source }

code-run

Execute JavaScript in a sandboxed environment (Node.js vm module).

Input:  { code: string, timeout_ms?: number }
Output: { success, result?, stdout, stderr }

๐Ÿค– Agent Workflows

๐Ÿ”ฌ Research Agent

Input: Topic + parent page ID Process: Web search โ†’ compile sources โ†’ create structured Notion page Output: Research page with sources, findings, and review checklist

๐Ÿ”„ GitHub Tracker

Input: GitHub repo + Notion database ID Process: Fetch PRs โ†’ compare with existing entries โ†’ create/update pages Output: Synced PR database in Notion

๐Ÿ“ Content Pipeline

Input: Outline page ID + parent page ID Process: Read outline โ†’ (optional research) โ†’ generate draft โ†’ create page Output: Draft page with review checklist, ready for human editing

๐Ÿ”„ Human-in-the-Loop

The task queue uses your Notion database as the control plane:

You create a task          โ†’  Status: Pending
Agent picks it up          โ†’  Status: Running
Agent writes results       โ†’  Status: Done โœ…
Something went wrong?      โ†’  Status: Failed โŒ (with error details)

You're always in control. Tasks only run when you create them. Results are always written back to Notion for your review.

Task Database Schema

Property

Type

Description

Name

Title

Task description

Status

Status

Pending โ†’ Running โ†’ Done/Failed

Type

Select

research / github-tracker / content-pipeline

Input

Text

JSON input parameters

Output

Text

JSON results

Error

Text

Error message (if failed)

๐Ÿงฐ Tech Stack

Layer

Technology

Language

TypeScript (ESM, strict)

Runtime

Node.js 22+

Protocol

Model Context Protocol (@modelcontextprotocol/sdk)

Notion API

@notionhq/client

Validation

Zod

AI (optional)

OpenAI SDK

Tests

Vitest

CI

GitHub Actions

๐Ÿงช Development

# Run tests
npm test

# Watch mode
npm run test:watch

# Type checking
npm run lint

# Build
npm run build

# Dev mode (watch + rebuild)
npm run dev

Available Scripts

Script

Description

npm run build

Compile TypeScript to dist/

npm run dev

Type-check in watch mode

npm start

Run the compiled MCP server

npm test

Run Vitest suite once

npm run test:watch

Run Vitest in watch mode

npm run lint

TypeScript type-check (--noEmit)

CI

Every push and pull request to main runs .github/workflows/ci.yml:

  1. Install dependencies (npm ci)

  2. TypeScript compile check (tsc --noEmit)

  3. Run tests (npm test)

๐Ÿ” Environment Variables

Variable

Required

Description

NOTION_API_KEY

โœ… Yes

Notion internal integration secret (ntn_โ€ฆ)

NOTION_DATABASE_ID

โœ… Yes

Task database ID

OPENAI_API_KEY

โŒ No

Enables AI content generation

Never commit .env โ€” it is gitignored. Use .env.example as a template.

โ“ Troubleshooting

Issue

Fix

Unauthorized from Notion

Verify NOTION_API_KEY and that the integration is connected to the page/database (โ‹ฏ โ†’ Connections)

Empty query results

Check NOTION_DATABASE_ID and database permissions

MCP server not showing in Claude

Ensure npm run build was run and the path in config points to dist/index.js

Type errors after changes

Run npm install then npm run lint

๐Ÿ“ธ Demo

Demo

๐Ÿค Contributing

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/amazing-feature)

  3. Commit changes (git commit -m "Add amazing feature")

  4. Push to the branch (git push origin feature/amazing-feature)

  5. Open a Pull Request

Please ensure npm run lint and npm test pass before submitting.

๐Ÿ“œ License

MIT โ€” see LICENSE.


Built for the Notion MCP Challenge ๐Ÿ†

Powered by Model Context Protocol

Available Tools

5 tools
code-runA

Execute JavaScript code in a sandboxed environment. Has access to Math, Date, JSON, and standard built-ins. No filesystem or network access.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesJavaScript code to execute
timeout_msNoTimeout in ms (default 5000)

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It transparently reveals sandboxing, available built-ins, and denied capabilities (filesystem/network). It stops short of disclosing error handling or the format of the execution result, but the core behavioral traits are well covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise and well-structured: two sentences, front-loaded with the main action and followed by key constraints. Every word contributes value and there is no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While the description covers the tool's main function and sandbox constraints, it omits crucial information about what the tool returns (e.g., stdout, last expression value, or promise resolution) and how errors are surfaced. Since there is no output schema, the description should have addressed this to be fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides descriptions for both parameters (code and timeout_ms), giving 100% schema coverage. The description adds no parameter-specific meaning beyond what the schema already states, achieving only the baseline score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Execute' with a clear resource 'JavaScript code' and the context 'sandboxed environment'. This unambiguously identifies the tool's function and easily distinguishes it from the sibling notion and web-search tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies when to use the tool (when JavaScript execution is needed) and explicitly states exclusions (no filesystem or network access), helping the agent avoid misuse. However, it does not explicitly name alternative tools or elaborate on when not to use it beyond those constraints.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion-queryA

Query a Notion database with filters and sorting. Returns matching pages with summarized properties.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortsNoSort criteria
filterNoNotion filter object โ€” see https://developers.notion.com/reference/post-database-query-filter
page_sizeNoResults per page (default 50)
database_idYesDatabase ID to query
start_cursorNoPagination cursor from previous response

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It does reveal that results are 'summarized properties' and that filters/sorting are supported, but it doesn't disclose pagination behavior, rate limits, authentication expectations, or error handling. The word 'Query' implies read-only but not explicitly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. It front-loads the core action and resource, then adds the return behavior. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with five parameters, no output schema, and no annotations, the description is adequate but not fully complete. It covers the central behavior but omits operational details like pagination, result structure, and filter object construction. The schema helps by documenting parameters and linking to Notion's filter docs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, as all five parameters have descriptions in the input schema, so the baseline is 3. The description adds the conceptual context of filters and sorting but does not provide parameter-level details beyond what the schema already contains.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Query a Notion database with filters and sorting.' It also states the return value as 'matching pages with summarized properties,' which helps distinguish from siblings like notion-read. However, it doesn't explicitly contrast with those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for querying Notion databases, but there is no explicit guidance on when to use it versus notion-read or notion-write. It doesn't provide exclusions or mention alternatives, so usage context is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion-readB

Read pages, databases, or blocks from Notion. Returns structured content including properties and child blocks.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_idNoNotion page ID to read
block_idNoBlock ID to read its children
database_idNoNotion database ID to read its schema

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds that it returns structured content including properties and child blocks, giving some behavioral insight. However, with no annotations, it omits details such as error handling, authentication, and whether it is strictly read-only in practical terms.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that clearly states the action and resource, with no redundant words or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, but the description does not clarify that exactly one of the three optional parameters should be supplied, and the absence of an output schema leaves return format ambiguous. Combined with no annotations, the description is incomplete for safe and correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides descriptions for all three parameters (page_id, block_id, database_id) with 100% coverage. The description maps these to the resource types but adds no extra semantic detail, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'read' and names the resources (pages, databases, blocks) from Notion, making the purpose clear. It does not explicitly differentiate from sibling tool 'notion-query', so it misses the top score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers no guidance on when to use this tool versus alternatives like notion-query or notion-write. It merely states what the tool does without context or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion-writeC

Create or update Notion pages. Supports creating pages with rich content blocks (headings, paragraphs, lists, toggles, code, callouts).

ParametersJSON Schema
NameRequiredDescriptionDefault
iconNoPage icon emoji
titleNoPage title
actionYescreate: new page, update: modify properties, append: add blocks
blocksNoContent blocks
page_idNoPage ID (required for update/append)
parent_idNoParent page or database ID (required for create)
propertiesNoPage properties to set

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral disclosure burden, but it only says 'Create or update Notion pages' and mentions content blocks. It fails to disclose the append behavior, side effects of updates, required page_id/parent_id relationships, or output/confirmation behavior, leaving significant behavioral ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences with no filler. The first sentence front-loads the core purpose, and the second adds relevant detail about supported content blocks, making it appropriately sized and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 7 parameters and nested objects, the description is under-specified. It omits the 'append' action entirely and does not explain the distinction between create, update, and append, or when page_id versus parent_id is required. The rich schema covers parameter syntax but not the behavioral context an agent needs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides descriptions for all parameters (100% coverage), so the baseline is 3. The description adds no new parameter semantics beyond listing block types already enumerated in the schema's blocks enum, so it neither enhances nor detracts from schema clarity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates or updates Notion pages via 'Create or update Notion pages' and lists supported content block types. It distinguishes itself from sibling read/query tools, but omits the 'append' action available in the schema, making it slightly incomplete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like notion-read or notion-query. The intended usage is only implied by the tool name and the phrase 'Create or update Notion pages', without explicit exclusions or alternative recommendations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv0.1.0
    • First observedcode-run
    • First observednotion-query
    • First observednotion-read
    • First observednotion-write
    • First observedweb-search

TDQS

B3.4/5.0

Scored across 5 tools

Disambiguation4/5

The Notion tools are mostly distinct: notion-read retrieves content, notion-write creates/updates pages, and notion-query filters databases. There is slight overlap between notion-read and notion-query when reading database contents, but descriptions clarify that query is for filtered/sorted lookups. Web-search and code-run are completely separate domains, so misselection is unlikely.

Naming Consistency3/5

Tool names follow a readable lowercase-with-hyphen style, and verbs are action-oriented (read, write, query, search, run). However, the prefix convention is inconsistent: Notion tools use 'notion-' while web-search and code-run do not. This mixed pattern makes it less predictable than a uniform verb_noun scheme.

Tool Count4/5

With 5 tools, the server is appropriately scoped for a small agent hub. Each tool serves a clear purpose, and the count is neither too thin nor bloated. Slightly more Notion-specific tools could be justified, but the current number feels reasonable.

Completeness3/5

The Notion tools cover core operations (read, write/update, query), but delete and block-level editing are missing, which could be a dead-end for some workflows. Web-search and code-run add generality but do not fill Notion-specific gaps. Overall, the surface is functional but not fully comprehensive for a Notion agent.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers