scholarx 2.3.2__tar.gz → 2.3.3__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.
- {scholarx-2.3.2/scholarx.egg-info → scholarx-2.3.3}/PKG-INFO +4 -4
- {scholarx-2.3.2 → scholarx-2.3.3}/README.md +1 -1
- {scholarx-2.3.2 → scholarx-2.3.3}/pyproject.toml +7 -3
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/connectors/tool_schema_fingerprints.json +1 -1
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/kg_ingest.py +4 -6
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/kg_media.py +1 -1
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/mcp_server.py +1 -1
- {scholarx-2.3.2 → scholarx-2.3.3/scholarx.egg-info}/PKG-INFO +4 -4
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx.egg-info/SOURCES.txt +1 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx.egg-info/entry_points.txt +3 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx.egg-info/requires.txt +2 -2
- scholarx-2.3.3/tests/test_default_content_surfaces.py +43 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/LICENSE +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/__init__.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/__main__.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/api_client.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/cli.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/connectors/__init__.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/connectors/mcp_source_presets.json +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/deduplication.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/mcp_config.json +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/models.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/ontology/__init__.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/ontology/certification.json +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/ontology/fixtures/records.json +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/ontology/mappings/source.yaml +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/ontology/migrations/manifest.json +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/ontology/scholarx.ttl +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/ontology/shapes/connector.shacl.ttl +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/paper_storage.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/prompts/__init__.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/providers/__init__.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/providers/arxiv.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/providers/base.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/providers/biorxiv.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/providers/osf.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/providers/pmc.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/providers/rss.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/providers/semantic_scholar.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/queue.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/__init__.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/scholarx-kg-ingestion/SKILL.md +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/scholarx-kg-ingestion/WORKFLOW.md +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/scholarx-operations/SKILL.md +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/scholarx-operations/agents/openai.yaml +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/scholarx-operations/references/catalog.md +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/scholarx-paper-library/SKILL.md +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/scholarx-paper-library/WORKFLOW.md +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/scholarx-paper-search/SKILL.md +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/scholarx-paper-search/WORKFLOW.md +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx.egg-info/dependency_links.txt +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/scholarx.egg-info/top_level.txt +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/setup.cfg +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_action_discovery.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_cli.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_cli_extended.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_init_dynamics.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_kg_ingest.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_kg_media.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_mcp_server.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_models.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_paper_storage.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_parallel_download.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_providers.py +0 -0
- {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_queue.py +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: scholarx
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.3
|
|
4
4
|
Summary: Universal Research Paper API — single entry point for arXiv, PMC, bioRxiv, medRxiv, PsyArXiv, OSF, and Semantic Scholar
|
|
5
5
|
Author-email: Project Maintainers <maintainers@users.noreply.github.com>
|
|
6
6
|
License: MIT
|
|
7
7
|
Requires-Python: <3.15,>=3.12
|
|
8
8
|
Description-Content-Type: text/markdown
|
|
9
9
|
License-File: LICENSE
|
|
10
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.
|
|
10
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18
|
|
11
11
|
Requires-Dist: httpx>=0.28.1
|
|
12
12
|
Requires-Dist: python-dotenv>=1.2.4
|
|
13
13
|
Requires-Dist: Levenshtein>=0.27.5
|
|
@@ -15,7 +15,7 @@ Requires-Dist: pypdf>=6.21.0
|
|
|
15
15
|
Requires-Dist: rich>=15.0.0
|
|
16
16
|
Requires-Dist: defusedxml>=0.7.1
|
|
17
17
|
Provides-Extra: mcp
|
|
18
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.
|
|
18
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18; extra == "mcp"
|
|
19
19
|
Provides-Extra: all
|
|
20
20
|
Requires-Dist: scholarx[mcp]; extra == "all"
|
|
21
21
|
Provides-Extra: test
|
|
@@ -48,7 +48,7 @@ Dynamic: license-file
|
|
|
48
48
|

|
|
49
49
|

|
|
50
50
|
|
|
51
|
-
*Version: 2.3.
|
|
51
|
+
*Version: 2.3.3*
|
|
52
52
|
|
|
53
53
|
> **Documentation** — Installation, deployment, usage across the API, CLI, MCP, and
|
|
54
54
|
> agent interfaces are maintained in the
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|

|
|
21
21
|

|
|
22
22
|
|
|
23
|
-
*Version: 2.3.
|
|
23
|
+
*Version: 2.3.3*
|
|
24
24
|
|
|
25
25
|
> **Documentation** — Installation, deployment, usage across the API, CLI, MCP, and
|
|
26
26
|
> agent interfaces are maintained in the
|
|
@@ -4,14 +4,14 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "scholarx"
|
|
7
|
-
version = "2.3.
|
|
7
|
+
version = "2.3.3"
|
|
8
8
|
description = "Universal Research Paper API — single entry point for arXiv, PMC, bioRxiv, medRxiv, PsyArXiv, OSF, and Semantic Scholar"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "MIT" }
|
|
11
11
|
requires-python = ">=3.12, <3.15"
|
|
12
12
|
authors = [{ name = "Project Maintainers", email = "maintainers@users.noreply.github.com" }]
|
|
13
13
|
dependencies = [
|
|
14
|
-
"agent-connector-sdk[mcp]>=0.3.
|
|
14
|
+
"agent-connector-sdk[mcp]>=0.3.18,<1.0.0",
|
|
15
15
|
"httpx>=0.28.1",
|
|
16
16
|
"python-dotenv>=1.2.4",
|
|
17
17
|
"Levenshtein>=0.27.5",
|
|
@@ -21,7 +21,7 @@ dependencies = [
|
|
|
21
21
|
]
|
|
22
22
|
|
|
23
23
|
[project.optional-dependencies]
|
|
24
|
-
mcp = ["agent-connector-sdk[mcp]>=0.3.
|
|
24
|
+
mcp = ["agent-connector-sdk[mcp]>=0.3.18,<1.0.0"]
|
|
25
25
|
all = ["scholarx[mcp]"]
|
|
26
26
|
test = [
|
|
27
27
|
"pytest-xdist>=3.8.0","pytest>=9.1.1", "pytest-asyncio>=1.4.0", "pytest-cov>=7.1.0", "respx>=0.23.1"]
|
|
@@ -39,6 +39,10 @@ scholarx = "scholarx.ontology"
|
|
|
39
39
|
[project.entry-points."agent_connector_sdk.source_connector_providers"]
|
|
40
40
|
scholarx = "scholarx.connectors"
|
|
41
41
|
|
|
42
|
+
# The one declared connector identity: the fleet name (SDK-CONNECTOR-CONTROL-R071).
|
|
43
|
+
[project.entry-points."agent_connector_sdk.connector"]
|
|
44
|
+
scholarx-mcp = "scholarx"
|
|
45
|
+
|
|
42
46
|
[tool.uv.workspace]
|
|
43
47
|
members = ["."]
|
|
44
48
|
|
|
@@ -33,13 +33,13 @@ from agent_connector_sdk.ingest import (
|
|
|
33
33
|
|
|
34
34
|
logger = logging.getLogger("scholarx.kg")
|
|
35
35
|
|
|
36
|
-
_BINDING = IngestBinding(connector="scholarx", stream="scholarx")
|
|
36
|
+
_BINDING = IngestBinding(connector="scholarx-mcp", stream="scholarx")
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
def _to_entity(record: dict[str, Any]) -> Entity:
|
|
40
40
|
return Entity(
|
|
41
|
-
id=record.get("id"),
|
|
42
|
-
node_type=record.get("node_type"),
|
|
41
|
+
id=str(record.get("id") or ""),
|
|
42
|
+
node_type=str(record.get("node_type") or ""),
|
|
43
43
|
properties={k: v for k, v in record.items() if k not in ("id", "node_type")},
|
|
44
44
|
)
|
|
45
45
|
|
|
@@ -60,9 +60,7 @@ def _to_document(record: dict[str, Any]) -> Document:
|
|
|
60
60
|
text=record["text"],
|
|
61
61
|
title=record.get("title"),
|
|
62
62
|
source_uri=record.get("source_uri"),
|
|
63
|
-
properties={
|
|
64
|
-
k: v for k, v in record.items() if k not in ("id", "text", "title", "source_uri", "updated_at")
|
|
65
|
-
},
|
|
63
|
+
properties={k: v for k, v in record.items() if k not in ("id", "text", "title", "source_uri", "updated_at")},
|
|
66
64
|
updated_at=record.get("updated_at"),
|
|
67
65
|
)
|
|
68
66
|
|
|
@@ -31,7 +31,7 @@ from agent_connector_sdk.ingest import (
|
|
|
31
31
|
|
|
32
32
|
logger = logging.getLogger("scholarx.kg")
|
|
33
33
|
|
|
34
|
-
_BINDING = IngestBinding(connector="scholarx", stream="scholarx")
|
|
34
|
+
_BINDING = IngestBinding(connector="scholarx-mcp", stream="scholarx")
|
|
35
35
|
|
|
36
36
|
# Paper metadata worth carrying onto the stored media asset's properties.
|
|
37
37
|
_META_FIELDS = ("id", "title", "doi", "url", "source", "published_date")
|
|
@@ -19,7 +19,7 @@ from pydantic import Field
|
|
|
19
19
|
|
|
20
20
|
load_config()
|
|
21
21
|
|
|
22
|
-
__version__ = "2.3.
|
|
22
|
+
__version__ = "2.3.3"
|
|
23
23
|
|
|
24
24
|
# Wall budget for an inline single-paper download before it is handed to the
|
|
25
25
|
# background queue. Kept well under the MCP child-call timeout so a slow source
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: scholarx
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.3
|
|
4
4
|
Summary: Universal Research Paper API — single entry point for arXiv, PMC, bioRxiv, medRxiv, PsyArXiv, OSF, and Semantic Scholar
|
|
5
5
|
Author-email: Project Maintainers <maintainers@users.noreply.github.com>
|
|
6
6
|
License: MIT
|
|
7
7
|
Requires-Python: <3.15,>=3.12
|
|
8
8
|
Description-Content-Type: text/markdown
|
|
9
9
|
License-File: LICENSE
|
|
10
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.
|
|
10
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18
|
|
11
11
|
Requires-Dist: httpx>=0.28.1
|
|
12
12
|
Requires-Dist: python-dotenv>=1.2.4
|
|
13
13
|
Requires-Dist: Levenshtein>=0.27.5
|
|
@@ -15,7 +15,7 @@ Requires-Dist: pypdf>=6.21.0
|
|
|
15
15
|
Requires-Dist: rich>=15.0.0
|
|
16
16
|
Requires-Dist: defusedxml>=0.7.1
|
|
17
17
|
Provides-Extra: mcp
|
|
18
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.
|
|
18
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18; extra == "mcp"
|
|
19
19
|
Provides-Extra: all
|
|
20
20
|
Requires-Dist: scholarx[mcp]; extra == "all"
|
|
21
21
|
Provides-Extra: test
|
|
@@ -48,7 +48,7 @@ Dynamic: license-file
|
|
|
48
48
|

|
|
49
49
|

|
|
50
50
|
|
|
51
|
-
*Version: 2.3.
|
|
51
|
+
*Version: 2.3.3*
|
|
52
52
|
|
|
53
53
|
> **Documentation** — Installation, deployment, usage across the API, CLI, MCP, and
|
|
54
54
|
> agent interfaces are maintained in the
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
agent-connector-sdk[mcp]<1.0.0,>=0.3.
|
|
1
|
+
agent-connector-sdk[mcp]<1.0.0,>=0.3.18
|
|
2
2
|
httpx>=0.28.1
|
|
3
3
|
python-dotenv>=1.2.4
|
|
4
4
|
Levenshtein>=0.27.5
|
|
@@ -10,7 +10,7 @@ defusedxml>=0.7.1
|
|
|
10
10
|
scholarx[mcp]
|
|
11
11
|
|
|
12
12
|
[mcp]
|
|
13
|
-
agent-connector-sdk[mcp]<1.0.0,>=0.3.
|
|
13
|
+
agent-connector-sdk[mcp]<1.0.0,>=0.3.18
|
|
14
14
|
|
|
15
15
|
[test]
|
|
16
16
|
pytest-xdist>=3.8.0
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""CONN-SCHOLARX-CONNECTOR-CONTENT-R001: the server lists its packaged skills, ontology and prompts by default."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import importlib
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
import pytest
|
|
10
|
+
from fastmcp import Client
|
|
11
|
+
|
|
12
|
+
PACKAGE = "scholarx"
|
|
13
|
+
ROOT = Path(list(importlib.import_module(PACKAGE).__path__)[0])
|
|
14
|
+
|
|
15
|
+
pytestmark = pytest.mark.spec("CONN-SCHOLARX-CONNECTOR-CONTENT-R001")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _server():
|
|
19
|
+
namespace = {"__name__": PACKAGE + ".mcp_server"}
|
|
20
|
+
exec(
|
|
21
|
+
"from agent_connector_sdk.mcp.server import create_mcp_server\n"
|
|
22
|
+
"result = create_mcp_server('scholarx-mcp', version='0', command_args=[])",
|
|
23
|
+
namespace,
|
|
24
|
+
)
|
|
25
|
+
return namespace["result"][1]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
async def _listings():
|
|
29
|
+
async with Client(_server()) as client:
|
|
30
|
+
resources = {str(r.uri) for r in await client.list_resources()}
|
|
31
|
+
prompts = {p.name for p in await client.list_prompts()}
|
|
32
|
+
return resources, prompts
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def test_default_content_surfaces() -> None:
|
|
36
|
+
resources, prompts = asyncio.run(_listings())
|
|
37
|
+
if list(ROOT.glob("skills/*/SKILL.md")):
|
|
38
|
+
assert any(u.startswith("skill://") for u in resources)
|
|
39
|
+
if list(ROOT.glob("ontology/*.ttl")):
|
|
40
|
+
assert any(u.startswith("ontology://scholarx-mcp/") for u in resources)
|
|
41
|
+
for path in ROOT.glob("prompts/*.json"):
|
|
42
|
+
if not path.name.startswith("_"):
|
|
43
|
+
assert path.stem in prompts
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|