Catalog PyPI
PACKAGE EXPLORERView in registry

agentf

PyPI

Self-hosted AI knowledge platform with 27 data source connectors, hybrid search, and MCP server

aichromadbclaudefastapiknowledge-basellmmcpragvector-search
Versions collected1
Direct dependencies39From release 0.2.1
Last observed20 Oct, 21:54 UTC

README

Version 0.2.1 documentation

AgentForge

Agent Data Distillation Platform

A self-hosted AI knowledge platform. Upload documents or connect external data sources, retrieve context via hybrid semantic + BM25 search with optional cross-encoder reranking, and integrate seamlessly with Claude Desktop / Claude Code through the MCP protocol.

中文文档 | PyPI | GitHub


Screenshots

DashboardData Sources
DashboardExternal Data Sources
Semantic SearchAgent Integration
Hybrid SearchAgent Integration

Features

CategoryDetails
Document IngestionTXT, MD, HTML, PDF, DOCX — file upload or paste text
External Data Sources27 connector types: object storage, relational DBs, OLAP, NoSQL, document platforms, code repos, enterprise cloud
Hybrid SearchVector cosine similarity + BM25 re-scoring for SQL/structured sources
RerankerOptional cross-encoder reranking (sentence-transformers) for higher precision
Scheduled SyncAPScheduler-based incremental sync for all external data sources
Vector BackendsChromaDB (default) or PostgreSQL + pgvector
User SystemAdmin + regular user roles, JWT httpOnly Cookie authentication
API TokensPersistent API tokens (aft_ prefix), SHA-256 hashed, shown only once at creation
MCP Serverstdio transport, exposes 5 tools for Claude to call
Agent IntegrationMCP config generation, Skill YAML download, API testing console
Web UIBulma CSS + Alpine.js, admin console, user document management

Architecture

Browser / Claude Desktop / API Client
         │
         ▼
┌──────────────────────────────────────────────────┐
│                   FastAPI App                     │
│  ┌──────────┐  ┌───────┐  ┌──────────────────┐  │
│  │  Pages   │  │  Auth │  │  Admin / me/*    │  │
│  │(Jinja2)  │  │  /me  │  │  datasources     │  │
│  └──────────┘  └───────┘  └──────────────────┘  │
│                                │                 │
│  ┌─────────────────────────────▼───────────────┐ │
│  │            Hybrid Retrieval Pipeline        │ │
│  │  Vector fan-out → BM25 re-score (SQL types) │ │
│  │  → Cross-encoder rerank (optional) → Top-K  │ │
│  └─────────────────────────────────────────────┘ │
│                                │                 │
│  ┌─────────────────────────────▼───────────────┐ │
│  │           Vector Store Facade               │ │
│  │  chroma_vector_store (default)              │ │
│  │  pg_vector_store     (optional pgvector)    │ │
│  └─────────────────────────────────────────────┘ │
│                                                   │
│  ┌──────────────────────────────────────────────┐ │
│  │  APScheduler  ←  DataSource Connectors (27)  │ │
│  │  incremental sync → ParsedDocument → chunks  │ │
│  └──────────────────────────────────────────────┘ │
│                                                   │
│  ┌──────────────┐   ┌──────────────────────────┐ │
│  │   ChromaDB   │   │  SQLite                  │ │
│  │  (documents) │   │  (users, tokens, sources)│ │
│  └──────────────┘   └──────────────────────────┘ │
└──────────────────────────────────────────────────┘
         │
         ▼
  MCP stdio server  (src/mcp/server.py)

User Data Isolation

Each user's documents are stored in a dedicated ChromaDB collection: u{user_id}_{collection_name}. The namespace prefix is enforced server-side — user A cannot access user B's data.


Quick Start

Requirements

  • Python 3.11+
  • (Optional) PostgreSQL + pgvector extension

Installation

Option 1 — PyPI (recommended)

pip install agentf

Option 2 — From source

git clone https://github.com/canmengfly/AgentForge.git
cd AgentForge
python -m venv .venv && source .venv/bin/activate
pip install -e .

Start

agentf-api

Open http://localhost:8000. A default admin account is created on first launch:

UsernamePassword
adminadmin123

Change the admin password immediately after first login.


External Data Sources

AgentForge supports 27 external data source types that can be connected, synced on a schedule, and searched alongside your uploaded documents.

Supported Connectors

CategoryTypes
Object StorageAlibaba Cloud OSS, Amazon S3, Tencent Cloud COS, Huawei Cloud OBS
Relational DBMySQL, PostgreSQL, Oracle, SQL Server, TiDB, OceanBase
OLAP / Data WarehouseApache Doris, ClickHouse, Apache Hive, Snowflake
Search / NoSQLElasticsearch, MongoDB
Document PlatformsFeishu (Lark) Docs, DingTalk Docs, Tencent Docs, Confluence, Notion, Yuque
Code PlatformsGitHub, GitLab
Enterprise CloudMicrosoft SharePoint, Google Drive

Adding a Data Source

  1. Navigate to Data Sources in the sidebar
  2. Click New Data Source, choose a type, and fill in the connection fields
  3. Click Test Connection to validate credentials
  4. Set a sync interval (e.g., 30 minutes) and save
  5. The scheduler automatically syncs the source and indexes content into your collection

Sync Behavior

  • Full sync: fetches all content on the first run
  • Incremental sync: subsequent runs fetch only new/modified content (where the source supports it)
  • Synced documents appear in the collection you specify and are searchable immediately

Search results combine two signals:

  1. Vector similarity — sentence-transformers cosine distance, applied to all collections
  2. BM25 re-scoring — term-frequency ranking applied to structured SQL sources (MySQL, PostgreSQL, Oracle, SQL Server, TiDB, OceanBase, Doris, ClickHouse, Hive, Snowflake)

An optional cross-encoder reranker can be enabled to further refine result ordering using a dedicated relevance model.

Unified Search Across All Sources

POST /me/search/all
Content-Type: application/json

{
  "query": "quarterly revenue by region",
  "top_k": 10
}

This searches across all your collections — uploaded documents and synced data sources — and returns a unified ranked result list.


Configuration

All settings are read from environment variables (.env file supported):

VariableDefaultDescription
DATA_DIR./dataRoot directory for SQLite and ChromaDB files
CHROMA_PERSIST_DIR{DATA_DIR}/chromaChromaDB persistence directory
JWT_SECRET(required)JWT signing secret (at least 32 characters)
JWT_EXPIRE_MINUTES10080Cookie token lifetime (minutes, default 7 days)
VECTOR_BACKENDchromachroma or pgvector
PG_VECTOR_URL""PostgreSQL DSN when using pgvector
EMBEDDING_DIM384Embedding vector dimension (must match model)
EMBEDDING_MODELall-MiniLM-L6-v2sentence-transformers model name
RERANKER_MODEL""Cross-encoder model name (empty = disabled)

.env example:

DATA_DIR=/var/agentforge/data
JWT_SECRET=replace-with-a-random-32-char-string
VECTOR_BACKEND=chroma
EMBEDDING_MODEL=all-MiniLM-L6-v2
RERANKER_MODEL=cross-encoder/ms-marco-MiniLM-L-6-v2

Authentication

After login, the server sets an httpOnly Cookie access_token. The browser sends it automatically on every subsequent request.

API Token (Programmatic Access)

  1. Log in to the Web UI and go to Agent Integration to create a token
  2. Token format: aft_<32 random characters> — shown only once, save it securely
  3. Include in request headers:
Authorization: Bearer aft_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

API Reference

User Document Endpoints (/me/*)

MethodPathDescription
GET/me/collectionsList your collections
POST/me/documents/textAdd a text document
POST/me/documents/uploadUpload a file (TXT/MD/HTML/PDF/DOCX)
GET/me/documentsList documents in a collection
DELETE/me/documents/{doc_id}Delete a document and its chunks
DELETE/me/collections/{name}Delete an entire collection
GET/me/chunksList chunks (paginated)
POST/me/searchSemantic search within a collection
POST/me/search/allHybrid search across all collections

Search request body:

{
  "query": "What is a transformer model?",
  "collection": "notes",
  "top_k": 5
}

Data Source Endpoints (/me/datasources)

MethodPathDescription
GET/me/datasourcesList your data sources
POST/me/datasourcesCreate a data source
GET/me/datasources/{id}Get a data source
PUT/me/datasources/{id}Update a data source
DELETE/me/datasources/{id}Delete a data source
POST/me/datasources/{id}/testTest connection
POST/me/datasources/{id}/syncTrigger manual sync

API Token Endpoints (/me/tokens)

MethodPathDescription
GET/me/tokensList your tokens
POST/me/tokensCreate a token (plaintext returned once)
DELETE/me/tokens/{id}Delete a token

Admin Endpoints (/api/admin/*)

MethodPathDescription
GET/api/admin/statsPlatform statistics
GET/api/admin/usersUser list (paginated, filterable)
POST/api/admin/usersCreate a user
PUT/api/admin/users/{id}Update user (role/email/password/status)
DELETE/api/admin/users/{id}Delete a user
GET/api/admin/collectionsList all collections across the platform

MCP Integration

The MCP server uses stdio transport and is launched on demand by Claude Desktop / Claude Code — no manual startup required.

Claude Desktop

Merge the following into ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "knowledge": {
      "command": "agentf-mcp",
      "args": [],
      "env": {
        "AFT_API_BASE": "http://localhost:8000",
        "AFT_API_KEY": "aft_your_token_here"
      }
    }
  }
}

This config can also be auto-generated from the Agent Integration page in the Web UI.

Claude Code

Add the same mcpServers block to your project's .claude/settings.json.

Available MCP Tools

ToolDescription
search_knowledgeSemantic search, returns ranked document chunks
list_collectionsList all collections and their chunk counts
add_text_documentAdd a text document to the knowledge base
get_document_chunksRetrieve all chunks of a specific document
delete_documentDelete a document and all its chunks

Supported File Types

ExtensionParser
.txtPlain text
.mdMarkdown (plain text extracted)
.html / .htmBeautifulSoup body extraction
.pdfpdfplumber
.docxpython-docx

Project Structure

src/
  api/
    main.py                     # FastAPI app, lifecycle, route registration
    routes/
      auth_routes.py            # /auth/*
      admin.py                  # /api/admin/*
      me.py                     # /me/* (documents, search, API tokens)
      datasources.py            # /me/datasources/* (data source CRUD + sync)
      config_export.py          # /export/*
      pages.py                  # HTML pages (Jinja2)
  core/
    config.py                   # pydantic-settings configuration
    auth.py                     # JWT + bcrypt + API token utilities
    database.py                 # SQLAlchemy SQLite setup
    models.py                   # User, APIToken, DataSource ORM models
    deps.py                     # FastAPI dependencies (CurrentUser, etc.)
    embeddings.py               # sentence-transformers model loader
    document_processor.py       # File parsing and text chunking
    vector_store.py             # Vector store facade
    chroma_vector_store.py      # ChromaDB backend
    pg_vector_store.py          # pgvector backend (optional)
    scheduler.py                # APScheduler incremental sync
    connectors/
      __init__.py
      oss_connector.py          # Alibaba Cloud OSS
      s3_connector.py           # Amazon S3
      tencent_cos_connector.py  # Tencent Cloud COS
      huawei_obs_connector.py   # Huawei Cloud OBS
      sql_connector.py          # MySQL / PostgreSQL (shared)
      oracle_connector.py       # Oracle Database
      sqlserver_connector.py    # Microsoft SQL Server
      tidb_connector.py         # TiDB (MySQL-compatible)
      oceanbase_connector.py    # OceanBase (MySQL-compatible)
      doris_connector.py        # Apache Doris (MySQL-compatible)
      elasticsearch_connector.py
      mongodb_connector.py
      clickhouse_connector.py
      hive_connector.py
      snowflake_connector.py
      feishu_connector.py       # Feishu (Lark) Docs
      dingtalk_connector.py     # DingTalk Docs
      tencent_docs_connector.py # Tencent Docs
      confluence_connector.py   # Atlassian Confluence
      notion_connector.py       # Notion
      yuque_connector.py        # Yuque (语雀)
      github_connector.py       # GitHub repositories
      gitlab_connector.py       # GitLab repositories
      sharepoint_connector.py   # Microsoft SharePoint
      google_drive_connector.py # Google Drive
  mcp/
    server.py                   # MCP stdio server
templates/                      # Jinja2 HTML templates
  base.html
  login.html
  dashboard.html
  search_page.html
  datasources.html              # Data source management UI
  export.html                   # Agent Integration page
  chunks.html
  admin/
    index.html
    users.html
tests/
  conftest.py
  test_auth.py
  test_admin.py
  test_documents.py
  test_search.py
  test_e2e.py
  test_new_datasources.py       # S3, Doris, ES, MongoDB, ClickHouse, Hive
  test_extended_datasources.py  # 14 new connectors
docs/
  datasources.md                # Connector configuration reference
  hybrid-search.md              # Hybrid retrieval architecture
  api-reference.md              # Full REST API reference
  deployment.md                 # Production deployment guide
  development.md                # Development and testing guide

Development & Testing

pytest tests/ -v
  • Temporary directories for ChromaDB and SQLite — no impact on production data
  • Deterministic dummy embeddings — no model download needed
  • Optional connector dependencies patched at sys.modules level — no real credentials needed

pgvector Backend (Optional)

To use PostgreSQL instead of ChromaDB:

  1. Install the pgvector extension:
    CREATE EXTENSION IF NOT EXISTS vector;
    
  2. Set environment variables:
    VECTOR_BACKEND=pgvector
    PG_VECTOR_URL=postgresql://user:pass@localhost/agentforge
    
  3. The table and HNSW cosine index are created automatically on startup.

Security

  • JWT tokens are stored in httpOnly Cookies — inaccessible to JavaScript.
  • Passwords are hashed with bcrypt (cost factor 12).
  • API tokens are stored as SHA-256 hashes; plaintext is returned only once at creation.
  • Data source credentials (passwords, API keys, secrets) are masked as *** in all API responses.
  • User data isolation is enforced at the storage layer, not just the API layer.
  • Admins cannot demote or delete their own account.
  • Disabled users cannot log in even with the correct password.

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.2.129 Apr 202639

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Repository

ACCESSIBLE
canmengfly/agentforge

Shared repository data · GitHub

License detected in repository
Not collected
Last push
29 Apr 2026
Archived
No
Contributor identities
— · partial collection

Public sponsor counts have not been collected. These signals belong to the repository owner.

Downloads & popularity

0count
Gauge · observed snapshots22 Oct 2026
10.50
2026-10-22: 0 · observed 2026-10-22T11:38:56.1728326Z
22 Oct22 Oct

github · 1 observations shown. Missing days are unknown.

View observed values
Date / source periodValueObserved at
2026-10-2202026-10-22T11:38:56.1728326Z

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 21:54 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:d4deb285d1cc59d89fe1fa95a9da7ac2ce4ada60a00b2fc19796f33de36ed46a