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.
- {freshrss_agent-2.3.1/freshrss_agent.egg-info → freshrss_agent-2.3.2}/PKG-INFO +3 -4
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/README.md +2 -2
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/api/api_client_base.py +11 -3
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/auth.py +7 -3
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/mcp_server.py +1 -1
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2/freshrss_agent.egg-info}/PKG-INFO +3 -4
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent.egg-info/SOURCES.txt +1 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent.egg-info/requires.txt +0 -1
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/pyproject.toml +2 -2
- freshrss_agent-2.3.2/requirements.txt +2 -0
- freshrss_agent-2.3.2/tests/test_sdk_centralization.py +17 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/test_transport_security.py +0 -2
- freshrss_agent-2.3.1/requirements.txt +0 -2
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/LICENSE +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/MANIFEST.in +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/__init__.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/__main__.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/api/__init__.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/api/api_client_reader.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/api/api_client_subscriptions.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/api_client.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/connectors/__init__.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/connectors/mcp_source_presets.json +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/connectors/tool_schema_fingerprints.json +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/freshrss_input_models.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/freshrss_response_models.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/kg_ingest.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/mcp/__init__.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/mcp/mcp_ingest.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/mcp/mcp_reader.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/mcp/mcp_subscriptions.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/mcp_config.json +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/ontology/__init__.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/ontology/certification.json +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/ontology/feed.ttl +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/ontology/fixtures/records.json +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/ontology/mappings/source.yaml +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/ontology/migrations/manifest.json +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/ontology/shapes/connector.shacl.ttl +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/prompts/__init__.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/prompts/feed_intelligence_specialist.json +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/skills/__init__.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/skills/freshrss-feed-reader/SKILL.md +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/skills/freshrss-knowledge-ingestion/SKILL.md +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/skills/freshrss-subscription-management/SKILL.md +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent.egg-info/dependency_links.txt +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent.egg-info/entry_points.txt +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent.egg-info/top_level.txt +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/scripts/security_contract.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/scripts/security_sanitizer.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/scripts/verify_api_integration.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/setup.cfg +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/__init__.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/conftest.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/test_api_wrapper.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/test_auth.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/test_fleet_name.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/test_freshrss_mcp_validation.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/test_init_dynamics.py +0 -0
- {freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/tests/test_kg_ingest.py +0 -0
- {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.
|
|
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
|

|
|
37
36
|

|
|
38
37
|
|
|
39
|
-
*Version: 2.3.
|
|
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.
|
|
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
|

|
|
9
9
|

|
|
10
10
|
|
|
11
|
-
*Version: 2.3.
|
|
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.
|
|
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
|
|
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 =
|
|
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() ->
|
|
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
|
|
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,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: freshrss-agent
|
|
3
|
-
Version: 2.3.
|
|
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
|

|
|
37
36
|

|
|
38
37
|
|
|
39
|
-
*Version: 2.3.
|
|
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.
|
|
416
|
+
agent (`:2.3.2`) with a co-located `:mcp` sidecar.
|
|
418
417
|
|
|
419
418
|
### Knowledge-graph database (`epistemic-graph`)
|
|
420
419
|
|
|
@@ -4,12 +4,12 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "freshrss-agent"
|
|
7
|
-
version = "2.3.
|
|
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",
|
|
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,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():
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/api/api_client_subscriptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/connectors/mcp_source_presets.json
RENAMED
|
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
|
{freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/ontology/migrations/manifest.json
RENAMED
|
File without changes
|
{freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/ontology/shapes/connector.shacl.ttl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{freshrss_agent-2.3.1 → freshrss_agent-2.3.2}/freshrss_agent/skills/freshrss-feed-reader/SKILL.md
RENAMED
|
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
|