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.
Files changed (65) hide show
  1. {scholarx-2.3.2/scholarx.egg-info → scholarx-2.3.3}/PKG-INFO +4 -4
  2. {scholarx-2.3.2 → scholarx-2.3.3}/README.md +1 -1
  3. {scholarx-2.3.2 → scholarx-2.3.3}/pyproject.toml +7 -3
  4. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/connectors/tool_schema_fingerprints.json +1 -1
  5. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/kg_ingest.py +4 -6
  6. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/kg_media.py +1 -1
  7. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/mcp_server.py +1 -1
  8. {scholarx-2.3.2 → scholarx-2.3.3/scholarx.egg-info}/PKG-INFO +4 -4
  9. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx.egg-info/SOURCES.txt +1 -0
  10. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx.egg-info/entry_points.txt +3 -0
  11. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx.egg-info/requires.txt +2 -2
  12. scholarx-2.3.3/tests/test_default_content_surfaces.py +43 -0
  13. {scholarx-2.3.2 → scholarx-2.3.3}/LICENSE +0 -0
  14. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/__init__.py +0 -0
  15. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/__main__.py +0 -0
  16. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/api_client.py +0 -0
  17. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/cli.py +0 -0
  18. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/connectors/__init__.py +0 -0
  19. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/connectors/mcp_source_presets.json +0 -0
  20. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/deduplication.py +0 -0
  21. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/mcp_config.json +0 -0
  22. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/models.py +0 -0
  23. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/ontology/__init__.py +0 -0
  24. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/ontology/certification.json +0 -0
  25. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/ontology/fixtures/records.json +0 -0
  26. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/ontology/mappings/source.yaml +0 -0
  27. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/ontology/migrations/manifest.json +0 -0
  28. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/ontology/scholarx.ttl +0 -0
  29. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/ontology/shapes/connector.shacl.ttl +0 -0
  30. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/paper_storage.py +0 -0
  31. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/prompts/__init__.py +0 -0
  32. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/providers/__init__.py +0 -0
  33. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/providers/arxiv.py +0 -0
  34. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/providers/base.py +0 -0
  35. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/providers/biorxiv.py +0 -0
  36. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/providers/osf.py +0 -0
  37. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/providers/pmc.py +0 -0
  38. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/providers/rss.py +0 -0
  39. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/providers/semantic_scholar.py +0 -0
  40. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/queue.py +0 -0
  41. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/__init__.py +0 -0
  42. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/scholarx-kg-ingestion/SKILL.md +0 -0
  43. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/scholarx-kg-ingestion/WORKFLOW.md +0 -0
  44. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/scholarx-operations/SKILL.md +0 -0
  45. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/scholarx-operations/agents/openai.yaml +0 -0
  46. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/scholarx-operations/references/catalog.md +0 -0
  47. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/scholarx-paper-library/SKILL.md +0 -0
  48. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/scholarx-paper-library/WORKFLOW.md +0 -0
  49. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/scholarx-paper-search/SKILL.md +0 -0
  50. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx/skills/scholarx-paper-search/WORKFLOW.md +0 -0
  51. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx.egg-info/dependency_links.txt +0 -0
  52. {scholarx-2.3.2 → scholarx-2.3.3}/scholarx.egg-info/top_level.txt +0 -0
  53. {scholarx-2.3.2 → scholarx-2.3.3}/setup.cfg +0 -0
  54. {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_action_discovery.py +0 -0
  55. {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_cli.py +0 -0
  56. {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_cli_extended.py +0 -0
  57. {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_init_dynamics.py +0 -0
  58. {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_kg_ingest.py +0 -0
  59. {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_kg_media.py +0 -0
  60. {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_mcp_server.py +0 -0
  61. {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_models.py +0 -0
  62. {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_paper_storage.py +0 -0
  63. {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_parallel_download.py +0 -0
  64. {scholarx-2.3.2 → scholarx-2.3.3}/tests/test_providers.py +0 -0
  65. {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.2
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.4
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.4; extra == "mcp"
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
  ![PyPI - Wheel](https://img.shields.io/pypi/wheel/scholarx)
49
49
  ![PyPI - Implementation](https://img.shields.io/pypi/implementation/scholarx)
50
50
 
51
- *Version: 2.3.2*
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
  ![PyPI - Wheel](https://img.shields.io/pypi/wheel/scholarx)
21
21
  ![PyPI - Implementation](https://img.shields.io/pypi/implementation/scholarx)
22
22
 
23
- *Version: 2.3.2*
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.2"
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.4,<1.0.0",
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.4,<1.0.0"]
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
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "algorithm": "agent-connector-sdk:mcp-tool-contract-compat:v2",
3
- "connector": "scholarx",
3
+ "connector": "scholarx-mcp",
4
4
  "schema_version": "1",
5
5
  "tools": {
6
6
  "scholarx_search": "588f116d74c2358f98dd975109b4fae33bd410d805dff3dc287f564924f41e16"
@@ -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.2"
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.2
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.4
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.4; extra == "mcp"
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
  ![PyPI - Wheel](https://img.shields.io/pypi/wheel/scholarx)
49
49
  ![PyPI - Implementation](https://img.shields.io/pypi/implementation/scholarx)
50
50
 
51
- *Version: 2.3.2*
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
@@ -51,6 +51,7 @@ scholarx/skills/scholarx-paper-search/WORKFLOW.md
51
51
  tests/test_action_discovery.py
52
52
  tests/test_cli.py
53
53
  tests/test_cli_extended.py
54
+ tests/test_default_content_surfaces.py
54
55
  tests/test_init_dynamics.py
55
56
  tests/test_kg_ingest.py
56
57
  tests/test_kg_media.py
@@ -1,3 +1,6 @@
1
+ [agent_connector_sdk.connector]
2
+ scholarx-mcp = scholarx
3
+
1
4
  [agent_connector_sdk.ontology_providers]
2
5
  scholarx = scholarx.ontology
3
6
 
@@ -1,4 +1,4 @@
1
- agent-connector-sdk[mcp]<1.0.0,>=0.3.4
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.4
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