@mackody/quickenrich-mcp 0.1.0
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.
- package/.codex-plugin/plugin.json +39 -0
- package/.env.example +17 -0
- package/.mcp.json +17 -0
- package/README.md +283 -0
- package/agents/AGENTS.md +6 -0
- package/agents/CLAUDE.md +6 -0
- package/package.json +40 -0
- package/scripts/agent-docs-smoke.mjs +72 -0
- package/scripts/agent-envelope-workflow-smoke.mjs +92 -0
- package/scripts/agent-surface-smoke.mjs +102 -0
- package/scripts/benchmark-contract-smoke.mjs +46 -0
- package/scripts/envelope-budget-smoke.mjs +37 -0
- package/scripts/killer-contract-smoke.mjs +206 -0
- package/scripts/lib/benchmark.mjs +92 -0
- package/scripts/lib/core.mjs +3303 -0
- package/scripts/live-benchmark.mjs +518 -0
- package/scripts/live-smoke.mjs +61 -0
- package/scripts/local-floor-benchmark.mjs +366 -0
- package/scripts/mcp-config-smoke.mjs +110 -0
- package/scripts/mcp-live-smoke.mjs +115 -0
- package/scripts/mock-api-smoke.mjs +112 -0
- package/scripts/native-capabilities-smoke.mjs +273 -0
- package/scripts/native-live-smoke.mjs +43 -0
- package/scripts/offline-contract-smoke.mjs +80 -0
- package/scripts/ops-contract-smoke.mjs +270 -0
- package/scripts/paged-finder-floor-smoke.mjs +93 -0
- package/scripts/perf-contract-smoke.mjs +111 -0
- package/scripts/quickenrich-agent-docs.mjs +109 -0
- package/scripts/quickenrich-mcp.mjs +201 -0
- package/scripts/quickenrich-token.mjs +175 -0
- package/scripts/rate-limit-contract-smoke.mjs +70 -0
- package/scripts/reverse-concurrency-floor-smoke.mjs +82 -0
- package/scripts/serialization-floor-smoke.mjs +42 -0
- package/scripts/token-bucket-contract-smoke.mjs +121 -0
- package/scripts/token-cli-smoke.mjs +59 -0
- package/skills/quickenrich/SKILL.md +20 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { spawnSync } from "node:child_process";
|
|
4
|
+
import { mkdtempSync, rmSync, statSync } from "node:fs";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { dirname, join } from "node:path";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
|
|
9
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
10
|
+
const cliPath = join(__dirname, "quickenrich-token.mjs");
|
|
11
|
+
|
|
12
|
+
function assert(condition, message) {
|
|
13
|
+
if (!condition) throw new Error(message);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function run(args, options = {}) {
|
|
17
|
+
const result = spawnSync(process.execPath, [cliPath, ...args], {
|
|
18
|
+
encoding: "utf8",
|
|
19
|
+
input: options.input,
|
|
20
|
+
env: {
|
|
21
|
+
...process.env,
|
|
22
|
+
QUICKENRICH_API_KEY: "",
|
|
23
|
+
QUICKENRICH_TOKEN: "",
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
if (result.status !== 0) throw new Error(`Command failed: ${args.join(" ")}\n${result.stderr || result.stdout}`);
|
|
27
|
+
return result.stdout.trim();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const tempDir = mkdtempSync(join(tmpdir(), "quickenrich-token-smoke-"));
|
|
31
|
+
const configPath = join(tempDir, "config.json");
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
const emptyStatus = JSON.parse(run(["status", "--json", "--config", configPath]));
|
|
35
|
+
assert(emptyStatus.configured === false, "Initial status should be unconfigured.");
|
|
36
|
+
|
|
37
|
+
const setOutput = run(["set", "--config", configPath], { input: "test-token-123\n" });
|
|
38
|
+
assert(setOutput.includes("Saved Quick Enrich API key"), "Set command did not report save.");
|
|
39
|
+
assert(!setOutput.includes("test-token-123"), "Set command printed the token.");
|
|
40
|
+
assert((statSync(configPath).mode & 0o777) === 0o600, "Config file was not chmod 600.");
|
|
41
|
+
|
|
42
|
+
const configuredStatus = JSON.parse(run(["status", "--json", "--config", configPath]));
|
|
43
|
+
assert(configuredStatus.configured === true, "Status should be configured after set.");
|
|
44
|
+
assert(configuredStatus.source === configPath, "Status source should be config path.");
|
|
45
|
+
assert(!JSON.stringify(configuredStatus).includes("test-token-123"), "Status printed the full token.");
|
|
46
|
+
|
|
47
|
+
const testOutput = JSON.parse(run(["test", "--json", "--config", configPath]));
|
|
48
|
+
assert(testOutput.ok === true, "Test command should succeed locally.");
|
|
49
|
+
assert(!JSON.stringify(testOutput).includes("test-token-123"), "Test command printed token.");
|
|
50
|
+
|
|
51
|
+
const removeOutput = run(["remove", "--config", configPath]);
|
|
52
|
+
assert(removeOutput.includes("Removed Quick Enrich API key"), "Remove command did not report removal.");
|
|
53
|
+
const removedStatus = JSON.parse(run(["status", "--json", "--config", configPath]));
|
|
54
|
+
assert(removedStatus.configured === false, "Status should be unconfigured after remove.");
|
|
55
|
+
|
|
56
|
+
console.log(JSON.stringify({ ok: true }, null, 2));
|
|
57
|
+
} finally {
|
|
58
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
59
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: quickenrich
|
|
3
|
+
description: Use when working with the bundled Quick Enrich MCP server for lead enrichment, batch lead pulls, or API-key setup.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Quick Enrich MCP
|
|
7
|
+
|
|
8
|
+
Use `quickenrich_auth_status` first to confirm whether `QUICKENRICH_API_KEY` or the local token config is present.
|
|
9
|
+
|
|
10
|
+
Prefer compact batch surfaces:
|
|
11
|
+
|
|
12
|
+
- Use `quickenrich_pipeline` for company-finder to domain-search workflows.
|
|
13
|
+
- Use `quickenrich_batch_pull_leads` for company-domain batches, Contact Finder paging, and Company Finder paging.
|
|
14
|
+
- Use `quickenrich_batch_employee_search` when you have exact LinkedIn URLs or exact names plus company URLs.
|
|
15
|
+
- Use `quickenrich_reverse_email` when you already have an email and need the matching person record.
|
|
16
|
+
- Use `quickenrich_contact_finder` or `quickenrich_company_finder` for discovery filters.
|
|
17
|
+
|
|
18
|
+
For large runs, pass `input_file`, `output_file`, and `resume_file` instead of pasting CSV/JSONL into the prompt. Use `projection` to keep row envelopes small and `max_credits` before any paid lane.
|
|
19
|
+
|
|
20
|
+
Credit-sensitive calls should be scoped with limits before execution. Contact finder is discovery-only; it returns `has_email` and `has_phone`, not the actual email or phone. Use `quickenrich-token doctor` before live runs and never paste API keys into prompts.
|