Skip to content

Commit 0b0bcd8

Browse files
committed
1.13.0
1 parent 2ce2257 commit 0b0bcd8

7 files changed

Lines changed: 51 additions & 10 deletions

File tree

.mcp/server.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77
"url": "https://github.com/ihor-sokoliuk/mcp-searxng",
88
"source": "github"
99
},
10-
"version": "1.12.1",
10+
"version": "1.13.0",
1111
"packages": [
1212
{
1313
"registryType": "npm",
1414
"identifier": "mcp-searxng",
15-
"version": "1.12.1",
15+
"version": "1.13.0",
1616
"transport": {
1717
"type": "stdio"
1818
},

CHANGELOG.md

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,25 @@
33
All notable changes to mcp-searxng are documented here.
44
Versions follow [Semantic Versioning](https://semver.org/).
55

6-
## [Unreleased]
6+
## [1.13.0] - 2026-07-30
77

88
### Added
99

10-
- **FlareSolverr-primary failover to Byparr:** Operators can configure `FLARESOLVERR_URL`, `BYPARR_URL`, or both. Dual mode always tries FlareSolverr first, advances to Byparr only for busy or transient-unavailable acquisition, and uses one uncached direct fetch only after the final provider is unavailable. Persistent 4xx, cancellation, solution-integrity failures, and solved non-2xx target status stop the chain. Provider timeouts and concurrency remain independent, cache entries use the winning provider, and canonically duplicate endpoints fail closed. Verified provider versions remain FlareSolverr 3.5.0 and Byparr 2.1.0 from 2026-07-30.
10+
- **FlareSolverr-primary failover to Byparr:** Operators can configure `FLARESOLVERR_URL`, `BYPARR_URL`, or both. Dual mode always tries FlareSolverr first, advances to Byparr only for busy or transient-unavailable acquisition, and uses one uncached direct fetch only after every configured provider is busy or unavailable. Persistent 4xx, cancellation, solution-integrity failures, and solved non-2xx target status stop the chain. Provider timeouts and concurrency remain independent, cache entries use the winning provider, and canonically duplicate endpoints fail closed. Verified provider versions remain FlareSolverr 3.5.0 and Byparr 2.1.0 from 2026-07-30. ([#220](https://github.com/ihor-sokoliuk/mcp-searxng/pull/220), [#223](https://github.com/ihor-sokoliuk/mcp-searxng/pull/223), [#224](https://github.com/ihor-sokoliuk/mcp-searxng/pull/224))
1111

1212
**Migration note:** Browser-solver endpoints are now validated during startup. A `FLARESOLVERR_URL` containing userinfo, a query, a fragment, or a non-HTTP(S) scheme now prevents startup instead of failing only when a URL read first uses it.
1313

14-
- **Bounded PDF text extraction:** `web_url_read` now extracts text-layer content from `application/pdf` responses using the new production `unpdf` dependency in a resource-limited worker. Input and output are capped at the lower of `URL_READ_MAX_CONTENT_LENGTH_BYTES` and 16 MiB, documents above 500 pages are rejected, parsing has a separate 30-second budget, and at most two extractions run concurrently. OCR is not supported. This supersedes the v1.10.0 behavior that rejected PDF responses.
14+
- **Bounded PDF text extraction:** `web_url_read` now extracts text-layer content from `application/pdf` responses using the new production `unpdf` dependency in a resource-limited worker. Input and output are capped at the lower of `URL_READ_MAX_CONTENT_LENGTH_BYTES` and 16 MiB, documents above 500 pages are rejected, parsing has a separate 30-second budget, and at most two extractions run concurrently. OCR is not supported. This supersedes the v1.10.0 behavior that rejected PDF responses. ([#221](https://github.com/ihor-sokoliuk/mcp-searxng/pull/221))
15+
16+
- **Expanded operator and client guidance:** New documentation covers self-hosted and public SearXNG instances, MCP client configuration, evidence-focused research workflows, and measured deployment profiles. ([#214](https://github.com/ihor-sokoliuk/mcp-searxng/pull/214), [#215](https://github.com/ihor-sokoliuk/mcp-searxng/pull/215), [#216](https://github.com/ihor-sokoliuk/mcp-searxng/pull/216), [#217](https://github.com/ihor-sokoliuk/mcp-searxng/pull/217), [#218](https://github.com/ihor-sokoliuk/mcp-searxng/pull/218))
1517

1618
### Fixed
1719

18-
- **HTTP rate-limit settings now honor the strict integer-validation contract:** `MCP_RATE_WINDOW_MS`, `MCP_RATE_INIT_MAX`, and `MCP_RATE_SESSION_MAX` reject fractional, unit-suffixed, exponent, non-decimal, non-positive, and unsafe values instead of accepting numeric prefixes. Invalid values fall back with a raw-value-free warning. Because previously accepted numeric prefixes may have produced a different effective limit, the documented default may be looser or stricter until the operator corrects the setting.
20+
- **HTTP rate-limit settings now honor the strict integer-validation contract:** `MCP_RATE_WINDOW_MS`, `MCP_RATE_INIT_MAX`, and `MCP_RATE_SESSION_MAX` reject fractional, unit-suffixed, exponent, non-decimal, non-positive, and unsafe values instead of accepting numeric prefixes. Invalid values fall back with a raw-value-free warning. Because previously accepted numeric prefixes may have produced a different effective limit, the documented default may be looser or stricter until the operator corrects the setting. ([#219](https://github.com/ihor-sokoliuk/mcp-searxng/pull/219))
21+
22+
- **Solver and PDF documentation now matches runtime boundaries:** Security and deployment guidance consistently describes browser-solver disclosure, acquisition fallback, PDF parsing limits, and timeout behavior. ([#222](https://github.com/ihor-sokoliuk/mcp-searxng/pull/222))
23+
24+
## [Unreleased]
1925

2026
## [1.12.1] - 2026-07-28
2127

__tests__/integration/cli.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,35 @@ async function runTests() {
140140
);
141141
}, results);
142142

143+
await testFunction('invalid browser solver configuration fails closed during startup', () => {
144+
const result = spawnSync(
145+
process.execPath,
146+
['--import', 'tsx', 'src/cli.ts'],
147+
{
148+
cwd: process.cwd(),
149+
env: {
150+
...process.env,
151+
MCP_HTTP_PORT: '',
152+
SEARXNG_URL: 'https://test-searx.example.com',
153+
FLARESOLVERR_URL: '',
154+
BYPARR_URL: 'http://operator:credential-value@byparr-secret.example',
155+
},
156+
encoding: 'utf8',
157+
timeout: 8000,
158+
}
159+
);
160+
161+
assert.equal(result.status, 1, `expected exit code 1, got ${result.status}; stderr:\n${result.stderr}`);
162+
assert.ok(
163+
result.stderr.includes(
164+
'BYPARR_URL must be an absolute HTTP or HTTPS service base URL without userinfo, a query, or a fragment.'
165+
),
166+
`expected value-free browser solver error in stderr, got:\n${result.stderr}`
167+
);
168+
assert.ok(!result.stderr.includes('credential-value'));
169+
assert.ok(!result.stderr.includes('byparr-secret.example'));
170+
}, results);
171+
143172
await testFunction('MCP_HTTP_PORT rejects a numeric prefix with a suffix', () => {
144173
const result = spawnSync(
145174
process.execPath,

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mcp-searxng",
3-
"version": "1.12.1",
3+
"version": "1.13.0",
44
"mcpName": "io.github.ihor-sokoliuk/mcp-searxng",
55
"description": "MCP server for SearXNG integration",
66
"license": "MIT",

src/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import {
4040
} from "./diagnostic-sanitizer.js";
4141
import { writeDiagnostic } from "./diagnostic-output.js";
4242
import { parseStrictInteger } from "./env-int.js";
43+
import { validateBrowserSolverEnvironment } from "./browser-solver-config.js";
4344

4445
import { packageVersion } from "./version.js";
4546

@@ -352,6 +353,11 @@ export function createMcpServer(): McpServer {
352353
// Main function
353354
export async function main() {
354355
initializeDiagnosticSanitizer();
356+
const browserSolverIssue = validateBrowserSolverEnvironment();
357+
if (browserSolverIssue) {
358+
throw new Error(browserSolverIssue);
359+
}
360+
355361
// Check for HTTP transport mode
356362
const httpPort = process.env.MCP_HTTP_PORT;
357363
if (httpPort) {

src/version.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export const packageVersion = "1.12.1";
1+
export const packageVersion = "1.13.0";

0 commit comments

Comments
 (0)