freshrss-agent 2.3.1__tar.gz → 2.3.2__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 (61) hide show
  1. {freshrss_agent-2.3.1/freshrss_agent.egg-info → freshrss_agent-2.3.2}/PKG-INFO +3 -4
  2. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/README.md +2 -2
  3. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/api/api_client_base.py +11 -3
  4. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/auth.py +7 -3
  5. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/mcp_server.py +1 -1
  6. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2/freshrss_agent.egg-info}/PKG-INFO +3 -4
  7. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent.egg-info/SOURCES.txt +1 -0
  8. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent.egg-info/requires.txt +0 -1
  9. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/pyproject.toml +2 -2
  10. freshrss_agent-2.3.2/requirements.txt +2 -0
  11. freshrss_agent-2.3.2/tests/test_sdk_centralization.py +17 -0
  12. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/test_transport_security.py +0 -2
  13. freshrss_agent-2.3.1/requirements.txt +0 -2
  14. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/LICENSE +0 -0
  15. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/MANIFEST.in +0 -0
  16. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/__init__.py +0 -0
  17. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/__main__.py +0 -0
  18. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/api/__init__.py +0 -0
  19. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/api/api_client_reader.py +0 -0
  20. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/api/api_client_subscriptions.py +0 -0
  21. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/api_client.py +0 -0
  22. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/connectors/__init__.py +0 -0
  23. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/connectors/mcp_source_presets.json +0 -0
  24. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/connectors/tool_schema_fingerprints.json +0 -0
  25. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/freshrss_input_models.py +0 -0
  26. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/freshrss_response_models.py +0 -0
  27. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/kg_ingest.py +0 -0
  28. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/mcp/__init__.py +0 -0
  29. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/mcp/mcp_ingest.py +0 -0
  30. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/mcp/mcp_reader.py +0 -0
  31. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/mcp/mcp_subscriptions.py +0 -0
  32. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/mcp_config.json +0 -0
  33. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/ontology/__init__.py +0 -0
  34. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/ontology/certification.json +0 -0
  35. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/ontology/feed.ttl +0 -0
  36. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/ontology/fixtures/records.json +0 -0
  37. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/ontology/mappings/source.yaml +0 -0
  38. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/ontology/migrations/manifest.json +0 -0
  39. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/ontology/shapes/connector.shacl.ttl +0 -0
  40. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/prompts/__init__.py +0 -0
  41. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/prompts/feed_intelligence_specialist.json +0 -0
  42. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/skills/__init__.py +0 -0
  43. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/skills/freshrss-feed-reader/SKILL.md +0 -0
  44. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/skills/freshrss-knowledge-ingestion/SKILL.md +0 -0
  45. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/skills/freshrss-subscription-management/SKILL.md +0 -0
  46. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent.egg-info/dependency_links.txt +0 -0
  47. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent.egg-info/entry_points.txt +0 -0
  48. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent.egg-info/top_level.txt +0 -0
  49. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/scripts/security_contract.py +0 -0
  50. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/scripts/security_sanitizer.py +0 -0
  51. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/scripts/verify_api_integration.py +0 -0
  52. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/setup.cfg +0 -0
  53. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/__init__.py +0 -0
  54. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/conftest.py +0 -0
  55. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/test_api_wrapper.py +0 -0
  56. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/test_auth.py +0 -0
  57. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/test_fleet_name.py +0 -0
  58. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/test_freshrss_mcp_validation.py +0 -0
  59. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/test_init_dynamics.py +0 -0
  60. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/test_kg_ingest.py +0 -0
  61. {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/test_startup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: freshrss-agent
3
- Version: 2.3.1
3
+ Version: 2.3.2
4
4
  Summary: FreshRSS API + MCP Server
5
5
  Author-email: Audel Rouhi <knucklessg1@gmail.com>
6
6
  License: MIT
@@ -14,7 +14,6 @@ Description-Content-Type: text/markdown
14
14
  License-File: LICENSE
15
15
  Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.11
16
16
  Requires-Dist: python-dotenv>=1.2.4
17
- Requires-Dist: requests>=2.34.2
18
17
  Provides-Extra: mcp
19
18
  Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.11; extra == "mcp"
20
19
  Provides-Extra: all
@@ -36,7 +35,7 @@ Dynamic: license-file
36
35
  ![PyPI - License](https://img.shields.io/pypi/l/freshrss-agent)
37
36
  ![GitHub last commit (by committer)](https://img.shields.io/github/last-commit/Knuckles-Team/freshrss-agent)
38
37
 
39
- *Version: 2.3.1*
38
+ *Version: 2.3.2*
40
39
 
41
40
  > **Documentation** — Installation, deployment, usage across the API, CLI, and MCP
42
41
  > backing platform are maintained in the
@@ -414,7 +413,7 @@ One multi-stage `docker/Dockerfile` builds the MCP-only image (`--target mcp`):
414
413
  ```bash
415
414
  ```
416
415
 
417
- agent (`:2.3.1`) with a co-located `:mcp` sidecar.
416
+ agent (`:2.3.2`) with a co-located `:mcp` sidecar.
418
417
 
419
418
  ### Knowledge-graph database (`epistemic-graph`)
420
419
 
@@ -8,7 +8,7 @@
8
8
  ![PyPI - License](https://img.shields.io/pypi/l/freshrss-agent)
9
9
  ![GitHub last commit (by committer)](https://img.shields.io/github/last-commit/Knuckles-Team/freshrss-agent)
10
10
 
11
- *Version: 2.3.1*
11
+ *Version: 2.3.2*
12
12
 
13
13
  > **Documentation** — Installation, deployment, usage across the API, CLI, and MCP
14
14
  > backing platform are maintained in the
@@ -386,7 +386,7 @@ One multi-stage `docker/Dockerfile` builds the MCP-only image (`--target mcp`):
386
386
  ```bash
387
387
  ```
388
388
 
389
- agent (`:2.3.1`) with a co-located `:mcp` sidecar.
389
+ agent (`:2.3.2`) with a co-located `:mcp` sidecar.
390
390
 
391
391
  ### Knowledge-graph database (`epistemic-graph`)
392
392
 
@@ -4,8 +4,10 @@
4
4
  import logging
5
5
  from typing import Any
6
6
 
7
- import requests
7
+ import httpx
8
8
  from agent_connector_sdk.exceptions import AuthError, UnauthorizedError
9
+ from agent_connector_sdk.http.client import create_http_client
10
+ from agent_connector_sdk.http.options import HttpClientOptions
9
11
  from agent_connector_sdk.tls.profile import ResolvedTLSProfile
10
12
  from agent_connector_sdk.tls.resolve import resolve_tls_profile
11
13
  from agent_connector_sdk.utilities import get_logger
@@ -35,7 +37,13 @@ class FreshRSSClientBase:
35
37
  self.username = username or ""
36
38
  self.api_password = api_password or ""
37
39
  self.tls_profile = tls_profile or resolve_tls_profile("freshrss")
38
- self.session = self.tls_profile.configure_requests_session(requests.Session())
40
+ self.session = create_http_client(
41
+ HttpClientOptions(
42
+ base_url=self.base_url,
43
+ tls=self.tls_profile,
44
+ allow_plaintext=self.base_url.startswith("http://"),
45
+ )
46
+ )
39
47
  self._auth_token: str | None = None
40
48
 
41
49
  # -- internals -----------------------------------------------------------
@@ -103,7 +111,7 @@ class FreshRSSClientBase:
103
111
  params.setdefault("output", "json")
104
112
  url = self._greader_url(path)
105
113
 
106
- def _send() -> requests.Response:
114
+ def _send() -> httpx.Response:
107
115
  return self.session.request(
108
116
  method,
109
117
  url,
@@ -18,6 +18,8 @@ import logging
18
18
 
19
19
  from agent_connector_sdk.config import setting
20
20
  from agent_connector_sdk.exceptions import AuthError, UnauthorizedError
21
+ from agent_connector_sdk.http.client import create_http_client
22
+ from agent_connector_sdk.http.options import HttpClientOptions
21
23
  from agent_connector_sdk.tls.profile import ResolvedTLSProfile
22
24
  from agent_connector_sdk.tls.resolve import resolve_tls_profile
23
25
 
@@ -63,13 +65,15 @@ def get_client(
63
65
 
64
66
  # --- Path 1: OIDC Delegation (RFC 8693 Token Exchange) ---
65
67
  if enabled:
66
- import httpx
67
-
68
68
  try:
69
69
  subject_token = current_user_token()
70
70
  if not subject_token:
71
71
  raise AuthError("no verified caller token to delegate")
72
- with httpx.Client(timeout=30) as http_client:
72
+ with create_http_client(
73
+ HttpClientOptions(
74
+ base_url=delegation_settings.token_endpoint, tls=tls_profile
75
+ )
76
+ ) as http_client:
73
77
  access_token = exchange_token(
74
78
  delegation_settings,
75
79
  subject_token=subject_token,
@@ -17,7 +17,7 @@ from .mcp import ( # noqa: F401
17
17
  register_subscriptions_tools,
18
18
  )
19
19
 
20
- __version__ = "2.3.1"
20
+ __version__ = "2.3.2"
21
21
 
22
22
  logger = get_logger(name="MCP_Server")
23
23
  logger.setLevel(logging.INFO)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: freshrss-agent
3
- Version: 2.3.1
3
+ Version: 2.3.2
4
4
  Summary: FreshRSS API + MCP Server
5
5
  Author-email: Audel Rouhi <knucklessg1@gmail.com>
6
6
  License: MIT
@@ -14,7 +14,6 @@ Description-Content-Type: text/markdown
14
14
  License-File: LICENSE
15
15
  Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.11
16
16
  Requires-Dist: python-dotenv>=1.2.4
17
- Requires-Dist: requests>=2.34.2
18
17
  Provides-Extra: mcp
19
18
  Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.11; extra == "mcp"
20
19
  Provides-Extra: all
@@ -36,7 +35,7 @@ Dynamic: license-file
36
35
  ![PyPI - License](https://img.shields.io/pypi/l/freshrss-agent)
37
36
  ![GitHub last commit (by committer)](https://img.shields.io/github/last-commit/Knuckles-Team/freshrss-agent)
38
37
 
39
- *Version: 2.3.1*
38
+ *Version: 2.3.2*
40
39
 
41
40
  > **Documentation** — Installation, deployment, usage across the API, CLI, and MCP
42
41
  > backing platform are maintained in the
@@ -414,7 +413,7 @@ One multi-stage `docker/Dockerfile` builds the MCP-only image (`--target mcp`):
414
413
  ```bash
415
414
  ```
416
415
 
417
- agent (`:2.3.1`) with a co-located `:mcp` sidecar.
416
+ agent (`:2.3.2`) with a co-located `:mcp` sidecar.
418
417
 
419
418
  ### Knowledge-graph database (`epistemic-graph`)
420
419
 
@@ -53,5 +53,6 @@ tests/test_fleet_name.py
53
53
  tests/test_freshrss_mcp_validation.py
54
54
  tests/test_init_dynamics.py
55
55
  tests/test_kg_ingest.py
56
+ tests/test_sdk_centralization.py
56
57
  tests/test_startup.py
57
58
  tests/test_transport_security.py
@@ -1,6 +1,5 @@
1
1
  agent-connector-sdk[mcp]<1.0.0,>=0.3.11
2
2
  python-dotenv>=1.2.4
3
- requests>=2.34.2
4
3
 
5
4
  [all]
6
5
  freshrss-agent[mcp]>=2.1.0
@@ -4,12 +4,12 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "freshrss-agent"
7
- version = "2.3.1"
7
+ version = "2.3.2"
8
8
  description = "FreshRSS API + MCP Server"
9
9
  readme = "README.md"
10
10
  classifiers = [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Environment :: Console", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3",]
11
11
  requires-python = ">=3.12, <3.15"
12
- dependencies = [ "agent-connector-sdk[mcp]>=0.3.11,<1.0.0", "python-dotenv>=1.2.4", "requests>=2.34.2",]
12
+ dependencies = [ "agent-connector-sdk[mcp]>=0.3.11,<1.0.0", "python-dotenv>=1.2.4", ]
13
13
  [[project.authors]]
14
14
  name = "Audel Rouhi"
15
15
  email = "knucklessg1@gmail.com"
@@ -0,0 +1,2 @@
1
+ agent-connector-sdk[mcp]>=0.3.11,<1.0.0
2
+ python-dotenv>=1.0.0
@@ -0,0 +1,17 @@
1
+ """CONN-FRESHRSS-AGENT-SDK-CENTRALIZATION-R001."""
2
+
3
+ from pathlib import Path
4
+
5
+ import httpx
6
+
7
+ from freshrss_agent.api import FreshRSSApi
8
+
9
+
10
+ def test_api_client_uses_sdk_http_client():
11
+ client = FreshRSSApi(
12
+ base_url="https://freshrss.example", username="u", api_password="p"
13
+ )
14
+ assert isinstance(client.session, httpx.Client)
15
+ root = Path(__file__).resolve().parents[1] / "freshrss_agent"
16
+ for source in root.rglob("*.py"):
17
+ assert "import requests" not in source.read_text(), source
@@ -44,7 +44,6 @@ def test_client_verifies_by_default():
44
44
  base_url="http://freshrss.local", username="admin", api_password="pw"
45
45
  )
46
46
  assert client.tls_profile.verify_enabled is True
47
- assert client.session.verify is True
48
47
 
49
48
 
50
49
  def test_client_honors_ca_bundle_profile(tmp_path):
@@ -59,7 +58,6 @@ def test_client_honors_ca_bundle_profile(tmp_path):
59
58
  )
60
59
  assert client.tls_profile.verify_enabled is True
61
60
  assert client.tls_profile.ca_bundle_path == ca_bundle
62
- assert client.session.verify == str(ca_bundle)
63
61
 
64
62
 
65
63
  def test_client_honors_named_tls_profile():
@@ -1,2 +0,0 @@
1
- agent-connector-sdk[mcp]>=0.2.1,<1.0.0
2
- python-dotenv>=1.0.0
File without changes
File without changes