Skip to main content
Glama
README.md
# complydir

A directory of compliance help, searchable from your
agent. complydir wraps a curated catalog of services
that work on ISO 27001, SOC 2, DORA and neighbouring
frameworks — consultancies, auditors and software —
published as a single catalog snapshot. There is no
account and no API key: the tools fetch the snapshot,
answer questions about it locally, and can queue a
new free listing for review.

Because search happens over the snapshot rather than
a remote search call, the filter rules are exact and
predictable. Tag filters never do substring matching:
asking for the region "Germany" returns services
tagged Germany, and asking for two frameworks returns
only services tagged with both.

## Tools

- `search_services` — multi-filter catalog search.
  All parameters are optional, but at least one is
  required: `query` (free text used to rank the
  filtered set), `framework` (a single framework),
  `frameworks` (several frameworks, ANDed together),
  `region`, `industry`, `service_type`, and `limit`
  (1–25, default 10). Tag matches are
  case-insensitive and exact, and a `service_type`
  of "Consulting" also matches services tagged
  "Consultants". For example, `frameworks`
  `["ISO 27001", "DORA"]` with region "Germany" and
  service_type "Consulting" returns German services
  covering both frameworks that consult.
- `check_if_listed` — whether a company is in the
  catalog. Takes a required `company_name` (for
  example "Scrut Automation") and answers with the
  matched record when it is listed.
- `get_service_details` — the full catalog record
  for one service, by its required `service_name`
  (for example "Compleye").
- `list_categories` — the distinct values in one
  dimension of the catalog, with counts. `dimension`
  is one of `frameworks`, `regions`, `industries`,
  `service_types` or `problems`; omit it to get
  every dimension at once.
- `submit_listing` — queue a free listing (the one
  write tool). Required: `name`, `url` (http or
  https), `email` (a contact address, not shown
  publicly) and `brief_summary` (10–300 characters).
  Optional: `description`, `linkedin`,
  `service_type`, `region_covered` and
  `compliance_framework_expertise`. Confirm the
  name, website, contact email and one-line summary
  with the user before calling — a queued listing
  goes into the same review queue as the free web
  form and is not live instantly.

## How it works

The read tools fetch the public snapshot from
`https://ismsdirectory.com/api/tools.json` and run
over it in memory; `submit_listing` posts to
`https://ismsdirectory.com/api/submit`. Both go
through one injectable fetch function, which is how
the test suite exercises everything against a small
hand-built snapshot with no live calls.

Two shapes are labelled reconstructions, because the
published material pins the fields rather than the
record layout: the per-service record fields beyond
a service's name and its framework, region, industry
and service-type tags, and the tools' output objects.
Outputs are built around the pinned fields — the
service name, its tags and the filters that matched.

Failures read plainly: a non-2xx upstream reply is
`complydir error: HTTP <status>`, an unreachable
upstream is `complydir unreachable`, and a snapshot
that does not parse as a list of records is
`complydir snapshot invalid`.

## CLI

Each tool is a subcommand taking one JSON argument
string:

```bash
npx @reneturcios/complydir search_services '{"frameworks":["ISO 27001","DORA"],"region":"Germany","service_type":"Consulting"}'
npx @reneturcios/complydir check_if_listed '{"company_name":"Scrut Automation"}'
npx @reneturcios/complydir get_service_details '{"service_name":"Compleye"}'
npx @reneturcios/complydir list_categories '{"dimension":"frameworks"}'
npx @reneturcios/complydir submit_listing '{"name":"Acme Compliance","url":"https://acme.example","email":"hello@acme.example","brief_summary":"ISO 27001 consulting for SaaS"}'
npx @reneturcios/complydir --version
```

Exit codes: `0` on success, `1` on a runtime error,
`2` on a usage error.

## MCP server

```bash
npx -y @reneturcios/complydir mcp
```

MCP client config:

```json
{
  "mcpServers": {
    "complydir": {
      "command": "npx",
      "args": ["-y", "@reneturcios/complydir", "mcp"]
    }
  }
}
```

## Docker

```bash
docker run -i ghcr.io/cloudcorprecords/complydir
docker run --rm ghcr.io/cloudcorprecords/complydir list_categories '{"dimension":"regions"}'
```

## Development

```bash
npm install
npm run build   # tsc -> dist/
npm test        # tsx --test test/*.test.ts (fake fetch only, no network)
npm run dev     # run the CLI from source
```

## License

MIT — Copyright (c) 2026 Rene Turcios