mfs-server 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mfs_server-0.4.0/.gitignore +11 -0
- mfs_server-0.4.0/PKG-INFO +159 -0
- mfs_server-0.4.0/README.md +57 -0
- mfs_server-0.4.0/openapitools.json +7 -0
- mfs_server-0.4.0/pyproject.toml +135 -0
- mfs_server-0.4.0/src/mfs_server/__init__.py +0 -0
- mfs_server-0.4.0/src/mfs_server/api/__init__.py +0 -0
- mfs_server-0.4.0/src/mfs_server/api/app.py +645 -0
- mfs_server-0.4.0/src/mfs_server/api/models.py +224 -0
- mfs_server-0.4.0/src/mfs_server/common/__init__.py +0 -0
- mfs_server-0.4.0/src/mfs_server/common/accel.py +125 -0
- mfs_server-0.4.0/src/mfs_server/common/converter.py +60 -0
- mfs_server-0.4.0/src/mfs_server/common/embedding.py +132 -0
- mfs_server-0.4.0/src/mfs_server/common/embeddings/__init__.py +85 -0
- mfs_server-0.4.0/src/mfs_server/common/embeddings/gemini.py +79 -0
- mfs_server-0.4.0/src/mfs_server/common/embeddings/local.py +79 -0
- mfs_server-0.4.0/src/mfs_server/common/embeddings/ollama.py +47 -0
- mfs_server-0.4.0/src/mfs_server/common/embeddings/onnx.py +196 -0
- mfs_server-0.4.0/src/mfs_server/common/embeddings/openai.py +85 -0
- mfs_server-0.4.0/src/mfs_server/common/embeddings/utils.py +33 -0
- mfs_server-0.4.0/src/mfs_server/common/embeddings/voyage.py +69 -0
- mfs_server-0.4.0/src/mfs_server/common/llm/__init__.py +77 -0
- mfs_server-0.4.0/src/mfs_server/common/llm/anthropic.py +72 -0
- mfs_server-0.4.0/src/mfs_server/common/llm/gemini.py +62 -0
- mfs_server-0.4.0/src/mfs_server/common/llm/openai.py +64 -0
- mfs_server-0.4.0/src/mfs_server/common/retrieval.py +125 -0
- mfs_server-0.4.0/src/mfs_server/common/summary.py +93 -0
- mfs_server-0.4.0/src/mfs_server/common/vlm.py +91 -0
- mfs_server-0.4.0/src/mfs_server/config.py +530 -0
- mfs_server-0.4.0/src/mfs_server/connectors/__init__.py +0 -0
- mfs_server-0.4.0/src/mfs_server/connectors/base.py +575 -0
- mfs_server-0.4.0/src/mfs_server/connectors/bigquery/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/bigquery/plugin.py +239 -0
- mfs_server-0.4.0/src/mfs_server/connectors/discord/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/discord/plugin.py +255 -0
- mfs_server-0.4.0/src/mfs_server/connectors/feishu/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/feishu/auth_login.py +132 -0
- mfs_server-0.4.0/src/mfs_server/connectors/feishu/oauth.py +207 -0
- mfs_server-0.4.0/src/mfs_server/connectors/feishu/plugin.py +659 -0
- mfs_server-0.4.0/src/mfs_server/connectors/file/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/file/plugin.py +589 -0
- mfs_server-0.4.0/src/mfs_server/connectors/gdrive/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/gdrive/plugin.py +251 -0
- mfs_server-0.4.0/src/mfs_server/connectors/github/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/github/plugin.py +327 -0
- mfs_server-0.4.0/src/mfs_server/connectors/gmail/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/gmail/plugin.py +214 -0
- mfs_server-0.4.0/src/mfs_server/connectors/hubspot/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/hubspot/plugin.py +181 -0
- mfs_server-0.4.0/src/mfs_server/connectors/jira/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/jira/plugin.py +210 -0
- mfs_server-0.4.0/src/mfs_server/connectors/linear/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/linear/plugin.py +196 -0
- mfs_server-0.4.0/src/mfs_server/connectors/mongo/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/mongo/plugin.py +217 -0
- mfs_server-0.4.0/src/mfs_server/connectors/mysql/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/mysql/plugin.py +276 -0
- mfs_server-0.4.0/src/mfs_server/connectors/notion/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/notion/plugin.py +239 -0
- mfs_server-0.4.0/src/mfs_server/connectors/postgres/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/postgres/plugin.py +303 -0
- mfs_server-0.4.0/src/mfs_server/connectors/registry.py +56 -0
- mfs_server-0.4.0/src/mfs_server/connectors/s3/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/s3/plugin.py +155 -0
- mfs_server-0.4.0/src/mfs_server/connectors/slack/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/slack/plugin.py +229 -0
- mfs_server-0.4.0/src/mfs_server/connectors/snowflake/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/snowflake/plugin.py +356 -0
- mfs_server-0.4.0/src/mfs_server/connectors/web/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/web/plugin.py +239 -0
- mfs_server-0.4.0/src/mfs_server/connectors/zendesk/__init__.py +4 -0
- mfs_server-0.4.0/src/mfs_server/connectors/zendesk/plugin.py +200 -0
- mfs_server-0.4.0/src/mfs_server/engine/__init__.py +0 -0
- mfs_server-0.4.0/src/mfs_server/engine/adapters.py +135 -0
- mfs_server-0.4.0/src/mfs_server/engine/engine.py +2984 -0
- mfs_server-0.4.0/src/mfs_server/engine/job_lane/__init__.py +318 -0
- mfs_server-0.4.0/src/mfs_server/engine/job_lane/queue.py +53 -0
- mfs_server-0.4.0/src/mfs_server/engine/job_lane/tree.py +105 -0
- mfs_server-0.4.0/src/mfs_server/engine/job_lane/worker.py +116 -0
- mfs_server-0.4.0/src/mfs_server/engine/job_watcher.py +120 -0
- mfs_server-0.4.0/src/mfs_server/engine/pipeline.py +409 -0
- mfs_server-0.4.0/src/mfs_server/engine/producers/__init__.py +79 -0
- mfs_server-0.4.0/src/mfs_server/engine/producers/base.py +195 -0
- mfs_server-0.4.0/src/mfs_server/engine/producers/image.py +52 -0
- mfs_server-0.4.0/src/mfs_server/engine/producers/message_stream.py +132 -0
- mfs_server-0.4.0/src/mfs_server/engine/producers/record_collection.py +125 -0
- mfs_server-0.4.0/src/mfs_server/engine/producers/render.py +156 -0
- mfs_server-0.4.0/src/mfs_server/engine/producers/table_schema.py +70 -0
- mfs_server-0.4.0/src/mfs_server/engine/producers/text.py +140 -0
- mfs_server-0.4.0/src/mfs_server/engine/state.py +79 -0
- mfs_server-0.4.0/src/mfs_server/processors/__init__.py +0 -0
- mfs_server-0.4.0/src/mfs_server/processors/text.py +75 -0
- mfs_server-0.4.0/src/mfs_server/server/__init__.py +0 -0
- mfs_server-0.4.0/src/mfs_server/server/__main__.py +155 -0
- mfs_server-0.4.0/src/mfs_server/server/connector_schemas.py +436 -0
- mfs_server-0.4.0/src/mfs_server/server/connector_wizard.py +802 -0
- mfs_server-0.4.0/src/mfs_server/server/setup_wizard.py +682 -0
- mfs_server-0.4.0/src/mfs_server/server/wizard_ui.py +223 -0
- mfs_server-0.4.0/src/mfs_server/storage/__init__.py +0 -0
- mfs_server-0.4.0/src/mfs_server/storage/artifact_cache.py +79 -0
- mfs_server-0.4.0/src/mfs_server/storage/file_state.py +103 -0
- mfs_server-0.4.0/src/mfs_server/storage/ids.py +64 -0
- mfs_server-0.4.0/src/mfs_server/storage/metadata/__init__.py +44 -0
- mfs_server-0.4.0/src/mfs_server/storage/metadata/base.py +234 -0
- mfs_server-0.4.0/src/mfs_server/storage/metadata/postgres.py +70 -0
- mfs_server-0.4.0/src/mfs_server/storage/metadata/sqlite.py +72 -0
- mfs_server-0.4.0/src/mfs_server/storage/milvus.py +468 -0
- mfs_server-0.4.0/src/mfs_server/storage/transformation_cache/__init__.py +45 -0
- mfs_server-0.4.0/src/mfs_server/storage/transformation_cache/base.py +137 -0
- mfs_server-0.4.0/src/mfs_server/storage/transformation_cache/postgres.py +86 -0
- mfs_server-0.4.0/src/mfs_server/storage/transformation_cache/sqlite.py +80 -0
- mfs_server-0.4.0/tests/.gitkeep +0 -0
- mfs_server-0.4.0/tests/_fakes.py +187 -0
- mfs_server-0.4.0/tests/test_api_auth.py +142 -0
- mfs_server-0.4.0/tests/test_artifact_adapter.py +117 -0
- mfs_server-0.4.0/tests/test_common_client_single_flight.py +103 -0
- mfs_server-0.4.0/tests/test_concurrency_gates.py +77 -0
- mfs_server-0.4.0/tests/test_config_toml_v04.py +186 -0
- mfs_server-0.4.0/tests/test_embedding_preload.py +38 -0
- mfs_server-0.4.0/tests/test_engine_chunkable_e2e.py +229 -0
- mfs_server-0.4.0/tests/test_engine_claim_global.py +221 -0
- mfs_server-0.4.0/tests/test_engine_connector_lifecycle.py +82 -0
- mfs_server-0.4.0/tests/test_engine_dir_summary_e2e.py +231 -0
- mfs_server-0.4.0/tests/test_engine_image_e2e.py +257 -0
- mfs_server-0.4.0/tests/test_engine_inspect_resolution.py +62 -0
- mfs_server-0.4.0/tests/test_engine_message_stream_e2e.py +225 -0
- mfs_server-0.4.0/tests/test_engine_record_collection_e2e.py +229 -0
- mfs_server-0.4.0/tests/test_engine_search_empty_scope.py +59 -0
- mfs_server-0.4.0/tests/test_engine_table_schema_e2e.py +193 -0
- mfs_server-0.4.0/tests/test_enumeration_since.py +136 -0
- mfs_server-0.4.0/tests/test_feishu_oauth.py +262 -0
- mfs_server-0.4.0/tests/test_file_connector_grep.py +61 -0
- mfs_server-0.4.0/tests/test_job_watcher.py +183 -0
- mfs_server-0.4.0/tests/test_milvus_filter_literals.py +56 -0
- mfs_server-0.4.0/tests/test_pipeline.py +380 -0
- mfs_server-0.4.0/tests/test_producers_base.py +115 -0
- mfs_server-0.4.0/tests/test_producers_image.py +67 -0
- mfs_server-0.4.0/tests/test_producers_message_stream.py +87 -0
- mfs_server-0.4.0/tests/test_producers_record_collection.py +120 -0
- mfs_server-0.4.0/tests/test_producers_table_schema.py +62 -0
- mfs_server-0.4.0/tests/test_producers_text.py +153 -0
- mfs_server-0.4.0/tests/test_reduce_coordinator.py +66 -0
- mfs_server-0.4.0/tests/test_reduce_queue.py +58 -0
- mfs_server-0.4.0/tests/test_reduce_tree.py +88 -0
- mfs_server-0.4.0/tests/test_reduce_worker.py +150 -0
- mfs_server-0.4.0/tests/test_setup_wizard_sections.py +92 -0
- mfs_server-0.4.0/tests/test_tx_cache_compute_lock.py +156 -0
- mfs_server-0.4.0/tests/test_upload_validation.py +105 -0
- mfs_server-0.4.0/uv.lock +6261 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: mfs-server
|
|
3
|
+
Version: 0.4.0
|
|
4
|
+
Summary: MFS server — Multi-source File-like Search (heavy side: connectors, ingest, retrieval, storage)
|
|
5
|
+
Project-URL: Homepage, https://github.com/zilliztech/mfs
|
|
6
|
+
Project-URL: Repository, https://github.com/zilliztech/mfs
|
|
7
|
+
Project-URL: Issues, https://github.com/zilliztech/mfs/issues
|
|
8
|
+
Author-email: Cheney Zhang <chen.zhang@zilliz.com>
|
|
9
|
+
License-Expression: Apache-2.0
|
|
10
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
16
|
+
Requires-Python: >=3.10
|
|
17
|
+
Requires-Dist: aiomysql>=0.3.2
|
|
18
|
+
Requires-Dist: aiosqlite>=0.20
|
|
19
|
+
Requires-Dist: chonkie>=0.4
|
|
20
|
+
Requires-Dist: fastapi>=0.110
|
|
21
|
+
Requires-Dist: httpx>=0.27
|
|
22
|
+
Requires-Dist: huggingface-hub>=0.20
|
|
23
|
+
Requires-Dist: markitdown[all]>=0.0.1
|
|
24
|
+
Requires-Dist: milvus-lite>=3.0
|
|
25
|
+
Requires-Dist: numpy>=1.24
|
|
26
|
+
Requires-Dist: onnxruntime>=1.17
|
|
27
|
+
Requires-Dist: openai>=1.40
|
|
28
|
+
Requires-Dist: pathspec>=1.1.1
|
|
29
|
+
Requires-Dist: pydantic-settings>=2.2
|
|
30
|
+
Requires-Dist: pydantic>=2.6
|
|
31
|
+
Requires-Dist: pymilvus>=2.5
|
|
32
|
+
Requires-Dist: pymongo>=4.13
|
|
33
|
+
Requires-Dist: python-multipart>=0.0.9
|
|
34
|
+
Requires-Dist: questionary>=2
|
|
35
|
+
Requires-Dist: rich>=13
|
|
36
|
+
Requires-Dist: tiktoken>=0.7
|
|
37
|
+
Requires-Dist: tokenizers>=0.15
|
|
38
|
+
Requires-Dist: tomli>=2.0; python_version < '3.11'
|
|
39
|
+
Requires-Dist: uvicorn[standard]>=0.27
|
|
40
|
+
Provides-Extra: all-connectors
|
|
41
|
+
Requires-Dist: aioboto3>=13.0; extra == 'all-connectors'
|
|
42
|
+
Requires-Dist: aiohttp>=3.9; extra == 'all-connectors'
|
|
43
|
+
Requires-Dist: asyncpg>=0.29; extra == 'all-connectors'
|
|
44
|
+
Requires-Dist: atlassian-python-api>=3.41; extra == 'all-connectors'
|
|
45
|
+
Requires-Dist: beautifulsoup4>=4.12; extra == 'all-connectors'
|
|
46
|
+
Requires-Dist: google-api-python-client>=2.120; extra == 'all-connectors'
|
|
47
|
+
Requires-Dist: google-auth>=2.29; extra == 'all-connectors'
|
|
48
|
+
Requires-Dist: google-cloud-bigquery>=3.20; extra == 'all-connectors'
|
|
49
|
+
Requires-Dist: hubspot-api-client>=11.0; extra == 'all-connectors'
|
|
50
|
+
Requires-Dist: lark-oapi>=1.2; extra == 'all-connectors'
|
|
51
|
+
Requires-Dist: notion-client>=2.2; extra == 'all-connectors'
|
|
52
|
+
Requires-Dist: slack-sdk>=3.27; extra == 'all-connectors'
|
|
53
|
+
Requires-Dist: snowflake-connector-python>=3.10; extra == 'all-connectors'
|
|
54
|
+
Provides-Extra: all-providers
|
|
55
|
+
Requires-Dist: anthropic>=0.40; extra == 'all-providers'
|
|
56
|
+
Requires-Dist: google-genai>=0.3; extra == 'all-providers'
|
|
57
|
+
Requires-Dist: ollama>=0.4; extra == 'all-providers'
|
|
58
|
+
Requires-Dist: voyageai>=0.3; extra == 'all-providers'
|
|
59
|
+
Provides-Extra: anthropic
|
|
60
|
+
Requires-Dist: anthropic>=0.40; extra == 'anthropic'
|
|
61
|
+
Provides-Extra: bigquery
|
|
62
|
+
Requires-Dist: google-cloud-bigquery>=3.20; extra == 'bigquery'
|
|
63
|
+
Provides-Extra: dev
|
|
64
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
|
|
65
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
66
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
67
|
+
Provides-Extra: embedding-onnx
|
|
68
|
+
Provides-Extra: feishu
|
|
69
|
+
Requires-Dist: lark-oapi>=1.2; extra == 'feishu'
|
|
70
|
+
Provides-Extra: gemini
|
|
71
|
+
Requires-Dist: google-genai>=0.3; extra == 'gemini'
|
|
72
|
+
Provides-Extra: github
|
|
73
|
+
Requires-Dist: httpx>=0.27; extra == 'github'
|
|
74
|
+
Provides-Extra: google
|
|
75
|
+
Requires-Dist: google-api-python-client>=2.120; extra == 'google'
|
|
76
|
+
Requires-Dist: google-auth>=2.29; extra == 'google'
|
|
77
|
+
Provides-Extra: hubspot
|
|
78
|
+
Requires-Dist: hubspot-api-client>=11.0; extra == 'hubspot'
|
|
79
|
+
Provides-Extra: jira
|
|
80
|
+
Requires-Dist: atlassian-python-api>=3.41; extra == 'jira'
|
|
81
|
+
Provides-Extra: local
|
|
82
|
+
Requires-Dist: einops>=0.8; extra == 'local'
|
|
83
|
+
Requires-Dist: sentence-transformers>=3.0; extra == 'local'
|
|
84
|
+
Provides-Extra: notion
|
|
85
|
+
Requires-Dist: notion-client>=2.2; extra == 'notion'
|
|
86
|
+
Provides-Extra: ollama
|
|
87
|
+
Requires-Dist: ollama>=0.4; extra == 'ollama'
|
|
88
|
+
Provides-Extra: pg
|
|
89
|
+
Requires-Dist: asyncpg>=0.29; extra == 'pg'
|
|
90
|
+
Provides-Extra: s3
|
|
91
|
+
Requires-Dist: aioboto3>=13.0; extra == 's3'
|
|
92
|
+
Provides-Extra: slack
|
|
93
|
+
Requires-Dist: slack-sdk>=3.27; extra == 'slack'
|
|
94
|
+
Provides-Extra: snowflake
|
|
95
|
+
Requires-Dist: snowflake-connector-python>=3.10; extra == 'snowflake'
|
|
96
|
+
Provides-Extra: voyage
|
|
97
|
+
Requires-Dist: voyageai>=0.3; extra == 'voyage'
|
|
98
|
+
Provides-Extra: web
|
|
99
|
+
Requires-Dist: aiohttp>=3.9; extra == 'web'
|
|
100
|
+
Requires-Dist: beautifulsoup4>=4.12; extra == 'web'
|
|
101
|
+
Description-Content-Type: text/markdown
|
|
102
|
+
|
|
103
|
+
# mfs-server
|
|
104
|
+
|
|
105
|
+
The server side of **MFS — Multi-source File-like Search**: a context engine
|
|
106
|
+
that turns code, docs, messages, databases, and object stores into one
|
|
107
|
+
file-like, searchable namespace for AI agents and developers.
|
|
108
|
+
|
|
109
|
+
`mfs-server` is the heavy half of MFS. It owns the connectors, the ingest
|
|
110
|
+
pipeline, the vector index, and the storage — and exposes everything over an
|
|
111
|
+
HTTP `/v1` control plane. The thin [`mfs` CLI](https://crates.io/crates/mfs-cli)
|
|
112
|
+
and the generated SDKs are just clients of this server.
|
|
113
|
+
|
|
114
|
+
- **Project & docs:** https://zilliztech.github.io/mfs/
|
|
115
|
+
- **Source:** https://github.com/zilliztech/mfs
|
|
116
|
+
|
|
117
|
+
## Install
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
pip install mfs-server # core + local ONNX embeddings, Milvus Lite, SQLite
|
|
121
|
+
pip install "mfs-server[all-connectors]" # add every connector's SDK
|
|
122
|
+
pip install "mfs-server[pg,s3,slack]" # or just the connectors you need
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
`pipx install mfs-server` works too if you want it isolated. The defaults run
|
|
126
|
+
fully offline: local ONNX (BGE) embeddings, Milvus Lite, and SQLite, with no
|
|
127
|
+
cloud account or API key.
|
|
128
|
+
|
|
129
|
+
## Run
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
mfs-server setup # optional: write $MFS_HOME/server.toml (defaults to ~/.mfs)
|
|
133
|
+
mfs-server run # all-in-one: API + inline task processing on 127.0.0.1:13619
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
For a horizontally scaled deployment, split the roles:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
mfs-server api # HTTP control plane only
|
|
140
|
+
mfs-server worker --concurrency auto # queue worker(s)
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Point the `mfs` CLI (or an SDK) at the server and you're ready to
|
|
144
|
+
`mfs add` a source and `mfs search` it. See the
|
|
145
|
+
[Quickstart](https://zilliztech.github.io/mfs/getting-started/) for the full
|
|
146
|
+
first run.
|
|
147
|
+
|
|
148
|
+
## Optional native acceleration
|
|
149
|
+
|
|
150
|
+
A few hot paths — the gitignore directory walk, parallel content hashing,
|
|
151
|
+
linear grep, and `tail` — have an optional PyO3 extension (`mfs-server-rs`). The
|
|
152
|
+
server falls back to a pure-Python implementation when it isn't installed, so it
|
|
153
|
+
is never required; it only makes large inputs faster. See
|
|
154
|
+
[Deployment](https://zilliztech.github.io/mfs/deployment/) for how to build it
|
|
155
|
+
in.
|
|
156
|
+
|
|
157
|
+
## License
|
|
158
|
+
|
|
159
|
+
Apache-2.0.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# mfs-server
|
|
2
|
+
|
|
3
|
+
The server side of **MFS — Multi-source File-like Search**: a context engine
|
|
4
|
+
that turns code, docs, messages, databases, and object stores into one
|
|
5
|
+
file-like, searchable namespace for AI agents and developers.
|
|
6
|
+
|
|
7
|
+
`mfs-server` is the heavy half of MFS. It owns the connectors, the ingest
|
|
8
|
+
pipeline, the vector index, and the storage — and exposes everything over an
|
|
9
|
+
HTTP `/v1` control plane. The thin [`mfs` CLI](https://crates.io/crates/mfs-cli)
|
|
10
|
+
and the generated SDKs are just clients of this server.
|
|
11
|
+
|
|
12
|
+
- **Project & docs:** https://zilliztech.github.io/mfs/
|
|
13
|
+
- **Source:** https://github.com/zilliztech/mfs
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pip install mfs-server # core + local ONNX embeddings, Milvus Lite, SQLite
|
|
19
|
+
pip install "mfs-server[all-connectors]" # add every connector's SDK
|
|
20
|
+
pip install "mfs-server[pg,s3,slack]" # or just the connectors you need
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
`pipx install mfs-server` works too if you want it isolated. The defaults run
|
|
24
|
+
fully offline: local ONNX (BGE) embeddings, Milvus Lite, and SQLite, with no
|
|
25
|
+
cloud account or API key.
|
|
26
|
+
|
|
27
|
+
## Run
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
mfs-server setup # optional: write $MFS_HOME/server.toml (defaults to ~/.mfs)
|
|
31
|
+
mfs-server run # all-in-one: API + inline task processing on 127.0.0.1:13619
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
For a horizontally scaled deployment, split the roles:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
mfs-server api # HTTP control plane only
|
|
38
|
+
mfs-server worker --concurrency auto # queue worker(s)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Point the `mfs` CLI (or an SDK) at the server and you're ready to
|
|
42
|
+
`mfs add` a source and `mfs search` it. See the
|
|
43
|
+
[Quickstart](https://zilliztech.github.io/mfs/getting-started/) for the full
|
|
44
|
+
first run.
|
|
45
|
+
|
|
46
|
+
## Optional native acceleration
|
|
47
|
+
|
|
48
|
+
A few hot paths — the gitignore directory walk, parallel content hashing,
|
|
49
|
+
linear grep, and `tail` — have an optional PyO3 extension (`mfs-server-rs`). The
|
|
50
|
+
server falls back to a pure-Python implementation when it isn't installed, so it
|
|
51
|
+
is never required; it only makes large inputs faster. See
|
|
52
|
+
[Deployment](https://zilliztech.github.io/mfs/deployment/) for how to build it
|
|
53
|
+
in.
|
|
54
|
+
|
|
55
|
+
## License
|
|
56
|
+
|
|
57
|
+
Apache-2.0.
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "mfs-server"
|
|
3
|
+
version = "0.4.0"
|
|
4
|
+
description = "MFS server — Multi-source File-like Search (heavy side: connectors, ingest, retrieval, storage)"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
license = "Apache-2.0"
|
|
7
|
+
authors = [
|
|
8
|
+
{ name = "Cheney Zhang", email = "chen.zhang@zilliz.com" },
|
|
9
|
+
]
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
classifiers = [
|
|
12
|
+
"Programming Language :: Python :: 3.10",
|
|
13
|
+
"Programming Language :: Python :: 3.11",
|
|
14
|
+
"Programming Language :: Python :: 3.12",
|
|
15
|
+
"Programming Language :: Python :: 3.13",
|
|
16
|
+
"License :: OSI Approved :: Apache Software License",
|
|
17
|
+
"Operating System :: OS Independent",
|
|
18
|
+
]
|
|
19
|
+
dependencies = [
|
|
20
|
+
"pymilvus>=2.5",
|
|
21
|
+
"openai>=1.40",
|
|
22
|
+
"fastapi>=0.110",
|
|
23
|
+
"uvicorn[standard]>=0.27",
|
|
24
|
+
"pydantic>=2.6",
|
|
25
|
+
"pydantic-settings>=2.2",
|
|
26
|
+
"httpx>=0.27",
|
|
27
|
+
"aiosqlite>=0.20",
|
|
28
|
+
"tomli>=2.0; python_version < '3.11'",
|
|
29
|
+
"tiktoken>=0.7",
|
|
30
|
+
"python-multipart>=0.0.9",
|
|
31
|
+
"chonkie>=0.4",
|
|
32
|
+
"markitdown[all]>=0.0.1",
|
|
33
|
+
"milvus-lite>=3.0",
|
|
34
|
+
"pathspec>=1.1.1",
|
|
35
|
+
"aiomysql>=0.3.2",
|
|
36
|
+
"pymongo>=4.13",
|
|
37
|
+
# Default embedding backend is local ONNX (BGE) — no API key required.
|
|
38
|
+
# See config.py EmbeddingConfig defaults. Provider can be switched to
|
|
39
|
+
# "openai" / etc via the setup wizard.
|
|
40
|
+
"onnxruntime>=1.17",
|
|
41
|
+
"huggingface-hub>=0.20",
|
|
42
|
+
"tokenizers>=0.15",
|
|
43
|
+
"numpy>=1.24",
|
|
44
|
+
# Wizard UI (mfs-server setup / connector add): colored panels, hints
|
|
45
|
+
# via rich; arrow-key selects + validators via questionary. Both have
|
|
46
|
+
# auto-detect for TTY/non-TTY and fall back gracefully.
|
|
47
|
+
"rich>=13",
|
|
48
|
+
"questionary>=2",
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
[project.optional-dependencies]
|
|
52
|
+
pg = ["asyncpg>=0.29"]
|
|
53
|
+
web = ["aiohttp>=3.9", "beautifulsoup4>=4.12"]
|
|
54
|
+
github = ["httpx>=0.27"]
|
|
55
|
+
# SaaS / message / object-store connectors (each pulls its official SDK)
|
|
56
|
+
slack = ["slack_sdk>=3.27"]
|
|
57
|
+
notion = ["notion-client>=2.2"]
|
|
58
|
+
jira = ["atlassian-python-api>=3.41"]
|
|
59
|
+
hubspot = ["hubspot-api-client>=11.0"]
|
|
60
|
+
bigquery = ["google-cloud-bigquery>=3.20"]
|
|
61
|
+
snowflake = ["snowflake-connector-python>=3.10"]
|
|
62
|
+
s3 = ["aioboto3>=13.0"]
|
|
63
|
+
google = ["google-api-python-client>=2.120", "google-auth>=2.29"] # gdrive + gmail
|
|
64
|
+
feishu = ["lark-oapi>=1.2"]
|
|
65
|
+
# discord/linear/zendesk use httpx only (already a core dep)
|
|
66
|
+
all-connectors = [
|
|
67
|
+
"asyncpg>=0.29", "aiohttp>=3.9", "beautifulsoup4>=4.12",
|
|
68
|
+
"slack_sdk>=3.27", "notion-client>=2.2", "atlassian-python-api>=3.41",
|
|
69
|
+
"hubspot-api-client>=11.0",
|
|
70
|
+
"google-cloud-bigquery>=3.20", "snowflake-connector-python>=3.10",
|
|
71
|
+
"aioboto3>=13.0", "google-api-python-client>=2.120", "google-auth>=2.29",
|
|
72
|
+
"lark-oapi>=1.2",
|
|
73
|
+
]
|
|
74
|
+
dev = [
|
|
75
|
+
"pytest>=8.0",
|
|
76
|
+
"pytest-asyncio>=0.23",
|
|
77
|
+
"ruff>=0.6",
|
|
78
|
+
]
|
|
79
|
+
# Kept as an alias for back-compat; the ONNX embedding stack is now a core
|
|
80
|
+
# dep so this extra is effectively a no-op. Existing
|
|
81
|
+
# `pip install mfs-server[embedding-onnx]` commands still work.
|
|
82
|
+
embedding-onnx = []
|
|
83
|
+
|
|
84
|
+
# Alternate embedding providers (each lazily imported by
|
|
85
|
+
# mfs_server.common.embeddings).
|
|
86
|
+
gemini = ["google-genai>=0.3"] # gemini embedding + LLM (vision-capable)
|
|
87
|
+
voyage = ["voyageai>=0.3"] # voyage-3-lite etc.
|
|
88
|
+
ollama = ["ollama>=0.4"] # local LLM/embedding via Ollama server
|
|
89
|
+
local = ["sentence-transformers>=3.0", "einops>=0.8"] # CPU/GPU sentence-transformers
|
|
90
|
+
|
|
91
|
+
# Alternate LLM providers for summary / VLM (mfs_server.common.llm).
|
|
92
|
+
anthropic = ["anthropic>=0.40"] # claude-sonnet-* (text + vision)
|
|
93
|
+
|
|
94
|
+
# Convenience bundle: every provider (text + vision LLMs and remote embeddings).
|
|
95
|
+
# Excludes 'local' (sentence-transformers pulls torch ~2 GB).
|
|
96
|
+
all-providers = [
|
|
97
|
+
"google-genai>=0.3",
|
|
98
|
+
"voyageai>=0.3",
|
|
99
|
+
"ollama>=0.4",
|
|
100
|
+
"anthropic>=0.40",
|
|
101
|
+
]
|
|
102
|
+
|
|
103
|
+
[project.scripts]
|
|
104
|
+
mfs-server = "mfs_server.server.__main__:main"
|
|
105
|
+
|
|
106
|
+
[project.urls]
|
|
107
|
+
Homepage = "https://github.com/zilliztech/mfs"
|
|
108
|
+
Repository = "https://github.com/zilliztech/mfs"
|
|
109
|
+
Issues = "https://github.com/zilliztech/mfs/issues"
|
|
110
|
+
|
|
111
|
+
[build-system]
|
|
112
|
+
requires = ["hatchling"]
|
|
113
|
+
build-backend = "hatchling.build"
|
|
114
|
+
|
|
115
|
+
[tool.hatch.build.targets.wheel]
|
|
116
|
+
packages = ["src/mfs_server"]
|
|
117
|
+
|
|
118
|
+
[tool.ruff]
|
|
119
|
+
line-length = 100
|
|
120
|
+
target-version = "py310"
|
|
121
|
+
|
|
122
|
+
[tool.pytest.ini_options]
|
|
123
|
+
asyncio_mode = "auto"
|
|
124
|
+
testpaths = ["tests"]
|
|
125
|
+
|
|
126
|
+
# Native hot-path acceleration lives in server-rs/ (PyO3, built with maturin:
|
|
127
|
+
# `cd server-rs && maturin develop --release`). It is OPTIONAL at runtime —
|
|
128
|
+
# mfs_server.common.accel falls back to pure Python when the wheel isn't installed.
|
|
129
|
+
# It is not published to PyPI; build it locally to opt in (see docs/deployment.md).
|
|
130
|
+
|
|
131
|
+
[dependency-groups]
|
|
132
|
+
dev = [
|
|
133
|
+
"fpdf2>=2.8.7",
|
|
134
|
+
"maturin>=1.13.3",
|
|
135
|
+
]
|
|
File without changes
|
|
File without changes
|