Skip to main content
Glama
alpadalar

ActiveDirectoryMCP

by alpadalar

ActiveDirectoryMCP

A Model Context Protocol (MCP) server that exposes Active Directory (LDAP) administration and auditing to MCP clients such as Claude Desktop, Claude Code and Cursor. It offers 45 tools for users, groups, computers, organizational units, domain security reporting and server diagnostics, over stdio or authenticated HTTP.

Status: the repository is public; the v1.0.0 release is not tagged yet. The server is tested against a mocked LDAP harness (unit and end-to-end tests) and against an OpenLDAP lab, which is not Active Directory. Checks against a live Active Directory domain are the responsibility of the operator before relying on it in production.

What it does and what it does not do by default

  • Read tools (list, get, report, audit, diagnostics) work out of the box.

  • The server is read-only by default. Create, modify, enable, disable, reset and membership tools are refused until security.allow_writes is true. Delete tools additionally need security.allow_destructive.

  • The HTTP transport refuses to start without an API key and answers 401 to every request that does not present one (only GET /health is open).

  • List and report tools return at most security.max_list_results entries (default 1000).

  • Outbound connections go only to the directory server you configure and, if you configure Azure Key Vault, to Azure Key Vault and the Azure identity endpoints. Logs and the optional audit file are written locally.

Related MCP server: LegacyMCP

Requirements

  • Python 3.11 or newer

  • uv

  • Network access to a domain controller; LDAPS is strongly recommended

  • A dedicated service account with the minimum rights you need (see Service account below)

  • Docker, only for the container deployment

Quickstart (stdio)

git clone https://github.com/alpadalar/ActiveDirectoryMCP.git
cd ActiveDirectoryMCP
uv sync --locked                 # add --extra azure for Azure Key Vault support
uv run pytest -q                 # optional: unit tests, no directory needed
cp ad-config/config.example.json ad-config/ad-config.json

Edit ad-config/ad-config.json before the first start: set active_directory.server, domain, base_dn and bind_dn for your domain. The example uses ldaps:// URLs, which security.require_secure_connection (true by default) requires; for an internal CA add security.ca_cert_file with the path of your CA certificate (see TLS), otherwise the system trust store is used. The example contains no key_vault section; add one only if you use Azure Key Vault. With the placeholder host names it starts but cannot connect to a directory until you edit it.

Provide the bind credential through the environment (or Key Vault, see Credentials) and start the server:

export AD_BIND_DN='CN=service-account,OU=Service Accounts,DC=example,DC=com'
read -rs AD_PASSWORD && export AD_PASSWORD     # type the password, it is not echoed
AD_MCP_CONFIG=ad-config/ad-config.json uv run activedirectory-mcp

The stdio server speaks MCP on stdin/stdout, so it waits for a client and prints log lines on the console. It has no --help; the only required setting is the AD_MCP_CONFIG environment variable. Connect it from an MCP client as shown in Connect an MCP client.

A failed initial directory connection is logged but does not stop the server, so the tool list is available even when the domain controller cannot be reached; tool calls then return errors.

Run over HTTP

The HTTP transport requires an API key. Generate one and export it:

export AD_MCP_HTTP_API_KEY="$(python3 -c 'import secrets; print(secrets.token_urlsafe(32))')"
export AD_BIND_DN='CN=service-account,OU=Service Accounts,DC=example,DC=com'
read -rs AD_PASSWORD && export AD_PASSWORD
AD_MCP_CONFIG=ad-config/ad-config.json uv run python -m active_directory_mcp.server_http \
  --host 127.0.0.1 --port 8813 --path /activedirectory-mcp

Flags: --host (default 0.0.0.0), --port (default 8813), --path (default /activedirectory-mcp), --config (overrides AD_MCP_CONFIG). Binding to 127.0.0.1 is the safe choice on a workstation; the default 0.0.0.0 listens on every interface.

Check the server (the endpoint accepts either header):

curl -s http://127.0.0.1:8813/health                       # 200, no key needed
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8813/activedirectory-mcp   # 401
curl -s -o /dev/null -w '%{http_code}\n' -H "Authorization: Bearer $AD_MCP_HTTP_API_KEY" \
  http://127.0.0.1:8813/activedirectory-mcp                 # not 401 (a plain GET gets 406)
curl -s -o /dev/null -w '%{http_code}\n' -H "X-API-Key: $AD_MCP_HTTP_API_KEY" \
  http://127.0.0.1:8813/activedirectory-mcp                 # not 401

/health returns {"status", "server", "version"}, performs no LDAP query and reveals no hostnames or credentials. For an LDAP-aware status call the health or test_connection tool through an MCP client. To avoid keeping the plaintext key in the server environment, supply its SHA-256 digest instead; see Security configuration.

The launcher scripts start_server.sh, start_http_server.sh and their .bat equivalents load a .env file (template: .env.example) and start the same entry points. They print progress messages to stdout, so do not use start_server.sh as an MCP client command: use the uv run activedirectory-mcp commands shown below.

Docker

docker build -t activedirectory-mcp .

The image runs the HTTP server as a non-root user on port 8813. It exits immediately with instructions if no API key is configured.

With Compose, which mounts ./ad-config read-only and refuses to start without a key:

export AD_MCP_HTTP_API_KEY="$(python3 -c 'import secrets; print(secrets.token_urlsafe(32))')"
cp ad-config/config.example.json ad-config/ad-config.json     # then edit it as described above
export AD_BIND_DN='CN=service-account,OU=Service Accounts,DC=example,DC=com'
read -rs AD_PASSWORD && export AD_PASSWORD                     # not echoed; skip both with Key Vault
docker compose up -d
docker compose ps
curl -sf http://127.0.0.1:8813/health

Compose passes AD_BIND_DN and AD_PASSWORD from your shell (or a .env file next to docker-compose.yml) into the container. Without them, and without Key Vault, the server exits at startup with "No AD bind password available" and restart: unless-stopped keeps retrying, so check docker compose logs if /health does not answer. For Azure Key Vault, uncomment the AZURE_KEYVAULT_* lines in docker-compose.yml instead and leave AD_PASSWORD unset; the plaintext variable is visible in docker inspect, so prefer Key Vault. Do not bake secrets into the image or the config file. The HTTP address inside the container is fixed (0.0.0.0:8813); change the published port in ports, not an environment variable.

Verification note: docker build, the fail-fast start without a key, /health, the 401 without a key and acceptance of both key headers were exercised against a container without a reachable directory. docker compose up against a real domain controller was not verified here.

Connect an MCP client

Create the config file first (see Quickstart). The bind password must not be written into a file that is committed or shared. Complete examples are in examples/.

Claude Desktop (stdio)

Edit claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\; the Linux location is not covered by the official documentation):

{
    "mcpServers": {
        "ActiveDirectoryMCP": {
            "command": "uv",
            "args": ["--directory", "/absolute/path/to/ActiveDirectoryMCP", "run", "activedirectory-mcp"],
            "env": {
                "AD_MCP_CONFIG": "/absolute/path/to/ActiveDirectoryMCP/ad-config/ad-config.json",
                "AD_BIND_DN": "CN=service-account,OU=Service Accounts,DC=example,DC=com",
                "AD_PASSWORD": "REPLACE_WITH_BIND_PASSWORD"
            }
        }
    }
}

Claude Desktop does not document environment-variable interpolation, so the env block holds the value literally in a local file. Prefer Azure Key Vault (leave AD_PASSWORD out and configure key_vault) so no password is stored. If uv is not found, use its absolute path as command.

Claude Code

Stdio (the command after -- is the server; -e sets its environment, -s the scope):

claude mcp add activedirectory -e AD_MCP_CONFIG="$PWD/ad-config/ad-config.json" \
  -e AD_BIND_DN="$AD_BIND_DN" -e AD_PASSWORD="$AD_PASSWORD" \
  -- uv --directory "$PWD" run activedirectory-mcp

Streamable HTTP with the API key header:

claude mcp add --transport http activedirectory http://localhost:8813/activedirectory-mcp \
  --header "Authorization: Bearer $AD_MCP_HTTP_API_KEY"

claude mcp add stores the values you pass in your Claude Code configuration. To keep secrets out of it, commit a project-scoped .mcp.json instead, which expands ${VAR} in command, args, env, url and headers:

{
    "mcpServers": {
        "activedirectory-stdio": {
            "type": "stdio",
            "command": "uv",
            "args": ["--directory", "${CLAUDE_PROJECT_DIR:-.}", "run", "activedirectory-mcp"],
            "env": {
                "AD_MCP_CONFIG": "${CLAUDE_PROJECT_DIR:-.}/ad-config/ad-config.json",
                "AD_BIND_DN": "${AD_BIND_DN}",
                "AD_PASSWORD": "${AD_PASSWORD}"
            }
        },
        "activedirectory-http": {
            "type": "http",
            "url": "http://localhost:8813/activedirectory-mcp",
            "headers": {
                "Authorization": "Bearer ${AD_MCP_HTTP_API_KEY}"
            }
        }
    }
}

The claude mcp add flags above were confirmed with claude mcp add --help; the commands were not executed here because they change the operator's Claude Code configuration.

Cursor

Put this in .cursor/mcp.json (project) or ~/.cursor/mcp.json (global). Cursor resolves ${env:NAME} in command, args, env, url and headers:

{
    "mcpServers": {
        "ActiveDirectoryMCP": {
            "command": "uv",
            "args": ["--directory", "/absolute/path/to/ActiveDirectoryMCP", "run", "activedirectory-mcp"],
            "env": {
                "AD_MCP_CONFIG": "/absolute/path/to/ActiveDirectoryMCP/ad-config/ad-config.json",
                "AD_BIND_DN": "${env:AD_BIND_DN}",
                "AD_PASSWORD": "${env:AD_PASSWORD}"
            }
        }
    }
}

For an HTTP server started as described above:

{
    "mcpServers": {
        "ActiveDirectoryMCP-HTTP": {
            "url": "http://localhost:8813/activedirectory-mcp",
            "headers": {
                "Authorization": "Bearer ${env:AD_MCP_HTTP_API_KEY}"
            }
        }
    }
}

Security configuration

Write access and the HTTP transport are locked down by default. Example (placeholder values only):

{
    "security": {
        "allow_writes": false,
        "allow_destructive": false,
        "max_list_results": 1000,
        "protect_privileged_targets": true,
        "audit_log_path": "/var/log/ad-mcp/audit.jsonl",
        "http_auth": {
            "required": true,
            "api_key_sha256": ["0000000000000000000000000000000000000000000000000000000000000000"]
        }
    }
}
  • security.allow_writes enables create, modify, enable, disable, reset, move and membership tools; security.allow_destructive additionally enables the delete tools and requires allow_writes. Refused calls return a structured error (write_blocked or destructive_blocked) naming the setting to change.

  • security.max_list_results caps list and report tools (0 = unlimited); responses include truncated and result_limit. The audit tools (get_inactive_users, get_password_policy_violations, get_stale_computers) scan the whole directory and cap only the findings they return.

  • security.protect_privileged_targets (default true) makes add_group_member, remove_group_member and reset_user_password refuse privileged groups and accounts (Domain/Enterprise/Schema Admins, Administrators, operator groups, krbtgt, Administrator, anything with adminCount=1). Set it to false only if you accept that anyone with allow_writes can change them.

  • security.audit_log_path (default unset) writes one JSON line per write or destructive tool call (timestamp, tool, risk, target, outcome, redacted arguments; no passwords) to a file opened in append mode with mode 0600 (the service user can still truncate or delete it; use chattr +a or ship the lines elsewhere if you need tamper resistance). The server refuses to start if the path cannot be opened and logs a warning when allow_writes is true without a path. Destructive calls also write an intent record first; HTTP calls add an actor.

  • security.audit_fail_closed (default false, needs audit_log_path) refuses write and destructive calls when the audit record cannot be written, instead of running them unaudited.

  • security.http_auth.required (default true) keeps the API key mandatory. Setting it to false disables HTTP authentication entirely; this is unsafe and only suitable for an isolated test.

  • security.require_secure_connection (default true) rejects non-LDAPS connection settings at startup. Password tools (create_user with a password, reset_user_password, reset_computer_password) additionally require an LDAPS or StartTLS connection and are refused otherwise.

  • reset_user_password and reset_computer_password return the new password in the response; treat it as sensitive and do not log it client-side. reset_computer_password breaks the machine's secure channel, so the machine must be rejoined or re-synced.

  • modify_* tools accept only allow-listed attributes (security-sensitive ones such as userAccountControl, servicePrincipalName and gPLink are always rejected). Every DN a tool receives must lie inside the configured base_dn.

Generate and hash an HTTP API key:

python3 -c "import secrets; print(secrets.token_urlsafe(32))"      # the key
python3 -c "import hashlib,sys; print(hashlib.sha256(sys.argv[1].encode()).hexdigest())" '<key>'

Provide the key through AD_MCP_HTTP_API_KEY, or only its digest through AD_MCP_HTTP_API_KEY_SHA256 (comma-separated for several keys) or security.http_auth.api_key_sha256. Plaintext keys are never read from the config file. Clients send Authorization: Bearer <key> or X-API-Key: <key>.

Tools

45 tools. The risk column is what security.allow_writes and security.allow_destructive enforce: read tools always run, write tools need allow_writes, destructive tools need both settings.

Users

Tool

Risk

Description

list_users

read

List users with optional filtering

get_user

read

Detailed information about one user

get_user_groups

read

Groups a user is a member of

create_user

write

Create a user account

modify_user

write

Modify allow-listed user attributes

enable_user

write

Enable a user account

disable_user

write

Disable a user account

reset_user_password

write

Reset a password, optionally generated (returned in the response)

delete_user

destructive

Delete a user account

Groups

Tool

Risk

Description

list_groups

read

List groups with filtering

get_group

read

Detailed information about one group

get_group_members

read

Members of a group, optionally recursive

get_nested_group_members

read

All direct and nested members through a server-side chain query

create_group

write

Create a security or distribution group

modify_group

write

Modify group attributes

add_group_member

write

Add a member to a group

remove_group_member

write

Remove a member from a group

delete_group

destructive

Delete a group

Computers

Tool

Risk

Description

list_computers

read

List computer accounts

get_computer

read

Detailed information about one computer

get_stale_computers

read

Computers that have not logged on for a number of days

create_computer

write

Create a computer object

modify_computer

write

Modify computer attributes

enable_computer

write

Enable a computer account

disable_computer

write

Disable a computer account

reset_computer_password

write

Reset a computer account password (returned in the response)

delete_computer

destructive

Delete a computer object

Organizational units

Tool

Risk

Description

list_organizational_units

read

List OUs with hierarchy

get_organizational_unit

read

Detailed information about one OU

get_organizational_unit_contents

read

Objects inside an OU

create_organizational_unit

write

Create an OU

modify_organizational_unit

write

Modify OU attributes

move_organizational_unit

write

Move an OU to a new parent

delete_organizational_unit

destructive

Delete an OU (also when empty)

Security and audit

Tool

Risk

Description

get_domain_info

read

Domain information and security settings

get_privileged_groups

read

Privileged group analysis

get_user_permissions

read

Effective permissions of a user

get_inactive_users

read

Users that have not logged on for a number of days

get_password_policy_violations

read

Users violating password policy

audit_admin_accounts

read

Administrative account audit

Diagnostics

Tool

Risk

Description

test_connection

read

LDAP connectivity test

health

read

Server health, including the LDAP state

get_schema_info

read

Schema information for all tools

get_rootdse_info

read

rootDSE details of the answering domain controller

get_tls_posture

read

Configured TLS settings, the live channel (ldaps, starttls, plaintext) and findings

Some LLM clients degrade when many tools are in context; that is a client limit, not a server one.

Multiple domains

One server instance can serve several domains. Point AD_MCP_CONFIG at a file with a domains object instead of a single-domain config (see ad-config/multi.example.json):

  • Each value under domains is either a path to an existing single-domain config file (relative paths are resolved against the multi-domain file) or the same config inline.

  • default_domain names the domain used when a call does not pass one (default: the first).

  • logging and http_auth are set once at the top level and apply to the whole instance.

  • Every other setting stays per domain, including security: write and destructive tools can be allowed in one domain and refused in another, and audit records carry the domain name.

With more than one domain, every tool takes an optional domain argument and a read-only list_domains tool reports the configured domains, the default and their write settings. The number of tools does not grow with the number of domains. With one domain the tool surface is unchanged.

The process-wide credential variables (AD_BIND_DN, AD_PASSWORD and the AZURE_KEYVAULT_* variables) would apply to every domain, so startup refuses them when several domains are configured. Give each domain its own password placeholder (for example "password": "${CORP_AD_PASSWORD}") or its own key_vault section.

For an LDAP proxy that does not publish the directory schema, set "skip_schema": true in that domain's active_directory section (the AD_MCP_SKIP_SCHEMA environment variable still sets the default for every domain).

Configuration reference

Credentials

The service account name and password are resolved in this order: Azure Key Vault, then the AD_BIND_DN and AD_PASSWORD environment variables, then values in the config file (a plaintext password there logs a deprecation warning). Startup fails with a clear error if no password can be resolved.

Azure Key Vault is an optional extra (uv sync --locked --extra azure):

{
    "key_vault": {
        "vault_url": "https://your-keyvault-name.vault.azure.net/",
        "username_secret_name": "ad-bind-username",
        "password_secret_name": "ad-bind-password"
    }
}

The same can be set with AZURE_KEYVAULT_URL, AZURE_KEYVAULT_SECRET_USERNAME and AZURE_KEYVAULT_SECRET_PASSWORD (see .env.example). Authentication uses DefaultAzureCredential: a managed identity (recommended in Azure), the service principal variables AZURE_TENANT_ID, AZURE_CLIENT_ID and AZURE_CLIENT_SECRET, or az login for local use. Grant the identity permission to read secrets only. username_secret_name is optional; without it the bind_dn from the config file is used.

Default organizational units

organizational_units sets where create_computer and create_group place objects when no ou is passed. It is optional: missing entries default to the built-in containers under base_dn (CN=Computers,<base_dn> for computers, CN=Users,<base_dn> otherwise).

TLS

{
    "security": {
        "enable_tls": true,
        "validate_certificate": true,
        "ca_cert_file": "/path/to/ca-certificate.pem",
        "require_secure_connection": true
    }
}

Keep certificate validation on. Use ca_cert_file for an internal CA. get_tls_posture reports the effective settings of a running server.

Performance

{
    "performance": {
        "max_retries": 3,
        "retry_delay": 1.0,
        "page_size": 1000
    }
}

connection_pool_size is deprecated and ignored; it is accepted only so older configuration files keep loading.

Service account

Create a dedicated account with the minimum rights for the tools you enable. Read-only use needs read access to the relevant subtrees only. Keep allow_writes off unless you need it, and delegate write permissions on specific OUs rather than using a domain admin.

Testing

Details are in TESTING_GUIDE.md.

uv run pytest -q                    # unit and end-to-end tests with a mocked directory
scripts/run_tests_with_ldap.sh      # live tests against the OpenLDAP lab (needs Docker)

Unit tests mock ldap3 and never connect to a directory; integration tests are deselected by default. The lab (docker-compose-openldap.yml) is OpenLDAP, not Active Directory: it does not enforce userAccountControl, unicodePwd TLS rules, lastLogon replication or AD ACLs. It needs a throwaway LAB_LDAP_PASSWORD, which the script generates per run. The lab client configuration is ad-config/openldap-lab.example.json; an example Cursor entry is in examples/cursor_openldap_config.json.

Manual smoke scripts live in tests/manual/ (http_server_smoke.py needs a running HTTP server; real_ad_smoke.py needs AD_MCP_CONFIG pointing at a real directory).

Troubleshooting

  • HTTP server exits at start with "requires an API key": set AD_MCP_HTTP_API_KEY (or the SHA-256 digest variable) as shown above.

  • Secure connection required but server URL is not ldaps://: use an ldaps:// server URL or, for a lab only, set security.require_secure_connection to false.

  • invalid CA public key file: security.ca_cert_file points at a missing file; fix or remove it.

  • Failed to retrieve a secret from Key Vault: configure the vault correctly or delete the key_vault section when using AD_BIND_DN and AD_PASSWORD.

  • write_blocked or destructive_blocked in a tool response: the server is read-only by default; set security.allow_writes (and security.allow_destructive for deletes) deliberately.

  • Errors mentioning a DN outside the base DN: the DN passed to a tool must be inside active_directory.base_dn.

  • LDAPS certificate errors: check the chain with openssl s_client -connect dc.example.com:636 -showcerts and point security.ca_cert_file at your CA.

  • Connectivity: ldapsearch -H ldaps://dc.example.com -D "<bind DN>" -W -b "<base DN>" "(objectClass=domain)", then the test_connection and get_tls_posture tools.

  • Port 8813 busy: pass --port or set HTTP_PORT for the launcher scripts.

  • Logs: docker logs -f activedirectory-mcp for the container; otherwise the file set in logging.file.

Project structure

src/active_directory_mcp/   server code (registry, policy, audit, auth, tools/, config/, core/)
tests/                      unit, e2e, integration, golden and manual tests
ad-config/                  example configurations (your ad-config.json stays untracked)
examples/                   MCP client configuration examples
ldap-init/                  OpenLDAP lab seed data
scripts/                    helper scripts
Dockerfile, docker-compose.yml, docker-compose-openldap.yml
pyproject.toml, uv.lock

Tools are declared once in src/active_directory_mcp/registry.py and served by both transports.

Contributing, security and license

Available Tools

45 tools
add_group_memberA

Add a member to a group.

Adds user, computer, or group as member of specified group.

Example:

  • add_group_member(group_name="Sales Team", member_dn="CN=John Smith,OU=Users,DC=company,DC=com")

Fails if the member is already in the group.

NameRequiredDescriptionDefault
member_dnYesDistinguished name of member to add
group_nameYesGroup name to add member to

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses accepted member types and that the operation fails if the member is already present, but it omits permissions/auth requirements, reversibility, side effects, and response behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded, with the main purpose first followed by accepted member types, an example, and the duplicate failure condition. The first two sentences overlap slightly, but the content is efficient overall.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter mutation tool, the description covers purpose, accepted inputs, an example, and one important failure mode. It is still incomplete for a tool with no annotations and no output schema because it does not address permissions, prerequisites, or what happens on success.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both parameters. The description adds value with a concrete example showing group_name usage and the DN format for member_dn, going slightly beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: adding a user, computer, or group as a member of a specified group. It is clearly distinguishable from sibling operations like remove_group_member and get_group_members, though it does not explicitly name those alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the operation itself, and the duplicate-member failure condition gives useful context. However, it does not explicitly say when to use this versus remove_group_member/get_group_members or mention prerequisites such as both objects already existing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

audit_admin_accountsB

Audit administrative accounts for security compliance.

Comprehensive security audit of privileged accounts including access patterns, policy compliance, and risk assessment.

Example:

  • audit_admin_accounts()

Critical for administrative account security.

NameRequiredDescriptionDefault

No parameters

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It names audit areas but does not state whether the tool is read-only, what permissions are required, what it returns, or how results are scoped; 'comprehensive' and 'critical' are assertions rather than behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded, but the second sentence largely restates the first, the empty example adds little, and 'Critical for administrative account security' is promotional fluff. It is short but contains avoidable repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter audit tool with no annotations or output schema, the description gives only high-level scope and omits the result content, format, and operational constraints. It is minimally adequate but leaves an agent unsure what to expect from the audit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so no parameter meaning is missing; the baseline for zero parameters is 4. The example audit_admin_accounts() reinforces the no-argument invocation but does not add further semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('Audit administrative accounts') and lists focus areas such as access patterns, policy compliance, and risk assessment, so the agent knows this is a privileged-account security audit. It does not explicitly contrast with siblings like get_privileged_groups or get_user_permissions, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description only says it is 'for security compliance' and 'Critical for administrative account security,' but gives no conditions for choosing it over overlapping sibling tools such as get_inactive_users, get_password_policy_violations, or get_privileged_groups. There is no when-to-use, when-not-to-use, or alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_computerA

Create a new computer object in Active Directory.

Creates computer account with appropriate attributes and service principal names. Configures DNS hostname and enables account.

Example:

  • create_computer(computer_name="NEW-DESKTOP", description="Marketing workstation")

Fails if a computer with that name already exists.

NameRequiredDescriptionDefault
ouNoOrganizational Unit DN to create computer in
descriptionNoComputer description
dns_hostnameNoDNS hostname
computer_nameYesComputer name (without $ suffix)
additional_attributesNoAdditional attributes to set

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden well: it discloses non-obvious side effects that a bare 'create' would hide — SPN assignment, DNS hostname configuration, and account auto-enablement — plus the duplicate-name failure mode. It stops short of stating required permissions/credentials or whether the operation is reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then supporting detail, then an example, then the failure condition — a sensible order with no filler. The second sentence slightly restates the first ("Creates computer account..."), but the incremental detail earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with five params, a nested-object param, no annotations, and no output schema, the description covers creation semantics, side effects, and failure but omits the default OU behavior and says nothing about what the call returns (no output schema exists to fill that gap). Adequate, but a real gap remains for an agent that needs to chain on the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all five parameters, making 3 the baseline. The description adds little parameter-level meaning beyond the example showing computer_name and description; it never explains what happens if `ou` is omitted (default container?) or what shape `additional_attributes` expects, despite the nested object.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opening sentence states a specific verb and resource ("Create a new computer object in Active Directory"), and the follow-up enumerates the concrete side effects (attributes, SPNs, DNS hostname, enabling the account). The resource is unmistakably distinct from create_user, create_group, and create_organizational_unit, so an agent can route on it without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The example implies the typical call shape and the failure condition ("Fails if a computer with that name already exists") gives a useful precondition. But there is no guidance on alternatives: nothing tells the agent to use get_computer first to check existence, or modify_computer/enable_computer for objects that already exist rather than recreating them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_groupA

Create a new group in Active Directory.

Creates security or distribution groups with specified scope and attributes. Supports Global, DomainLocal, and Universal scopes.

Example:

  • create_group(group_name="Marketing Team", group_scope="Global", group_type="Security", description="Marketing department")

Fails if a group with that name already exists.

NameRequiredDescriptionDefault
ouNoOrganizational Unit DN to create group in
group_nameYesGroup name (sAMAccountName)
group_typeNoGroup type (Security, Distribution)Security
descriptionNoGroup description
group_scopeNoGroup scope (Global, DomainLocal, Universal)Global
display_nameNoDisplay name for the group
additional_attributesNoAdditional attributes to set

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It usefully discloses that this is a mutation, supports Security/Distribution types and Global/DomainLocal/Universal scopes, and fails on duplicate names, but it omits permission requirements, reversibility, and what happens on failure beyond the duplicate case.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and then adds scope/type support, an example, and the duplicate-name failure. It is appropriately sized, though the second sentence slightly repeats the first and the example could be tighter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter mutation tool with no annotations and no output schema, the description covers the main semantics and failure mode. However, it does not address permissions/authentication needs or return behavior, leaving meaningful gaps for an agent invoking a privileged Active Directory write operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds an example showing how group_name, group_scope, group_type, and description are used together. It does not explain ou, display_name, or additional_attributes beyond the schema, so it is helpful but not complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: create a new Active Directory group. It distinguishes the operation from siblings like modify_group, delete_group, and list_groups by emphasizing creation and the duplicate-name failure condition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it by stating it creates a new group and fails if the group already exists, but it does not explicitly direct the agent to modify_group for existing groups or list_groups/get_group to check existence. The example helps with invocation but not with alternative selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_organizational_unitB

Create a new Organizational Unit.

Creates OU with specified attributes and management settings.

Example:

  • create_organizational_unit(name="Marketing", parent_ou="OU=Departments,DC=company,DC=com", description="Marketing department")

Establishes OU hierarchy.

NameRequiredDescriptionDefault
nameYesName of the OU
parent_ouNoParent OU DN
managed_byNoDN of user/group managing this OU
descriptionNoOU description
additional_attributesNoAdditional attributes to set

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden for a mutation tool. It says the tool creates an OU with attributes and management settings, but omits permissions required, whether parent_ou must already exist, duplicate-name behavior, reversibility, and response details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and the example is useful. There is minor redundancy between 'Create a new Organizational Unit' and 'Creates OU with specified attributes and management settings', but it remains compact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema is complete for parameters and the example helps with parent_ou formatting. But with no annotations and no output schema, the description leaves material gaps around prerequisites, failure modes, permissions, and sibling selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all five parameters. The example usefully illustrates DN syntax for parent_ou, but managed_by and additional_attributes receive no extra explanation in the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Create a new Organizational Unit', and adds that it establishes OU hierarchy. It distinguishes itself implicitly from modify/delete/move OU siblings, but does not name alternatives explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The example shows a typical call with name, parent_ou, and description, implying usage. However, it gives no explicit when-to-use guidance, no when-not conditions, and no alternatives such as modify_organizational_unit or move_organizational_unit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_userA

Create a new user account in Active Directory.

Creates a user with specified attributes in the designated organizational unit. Sets the user principal name, sets the initial password and enables the account.

Example:

  • create_user(username="jsmith", password="TempPass123!", first_name="John", last_name="Smith", email="jsmith@company.com")

Supports additional attributes and custom OU placement.

NameRequiredDescriptionDefault
ouNoOrganizational Unit DN to create user in
emailNoUser's email address
passwordYesUser password
usernameYesUsername (sAMAccountName)
last_nameYesUser's last name
first_nameYesUser's first name
additional_attributesNoAdditional attributes to set

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose real behavior: it sets the UPN, sets an initial password, and enables the account in one shot. However, it omits what happens on duplicate sAMAccountName, whether the password must satisfy domain policy, permission requirements, and whether the operation is reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then supporting detail, then a compact example. The second sentence partially restates the first ('Creates a user with specified attributes'), which is minor redundancy but nothing is bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter nested mutation tool with no annotations and no output schema, the description covers the happy path adequately but leaves the agent without failure-mode, permission, or return-value guidance (e.g., does it return the created DN?).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so every parameter is already documented in the schema; baseline 3 applies. The example call and the 'custom OU placement' / 'additional attributes' sentences add modest framing (which params combine in a typical call) but no new semantics such as password constraints or OU default behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb and resource: 'Create a new user account in Active Directory.' That is instantly distinguishable from the sibling mutators modify_user, delete_user, enable_user, and disable_user.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description tells you what gets created and where, but never states when to prefer this tool over create_computer or create_group, nor when to follow up with modify_user. No prerequisites (admin rights, existing OU) are mentioned, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_computerB

Delete a computer object from Active Directory.

Permanently removes computer account and trust relationship.

Example:

  • delete_computer(computer_name="OLD-DESKTOP")

Cleans up stale computer accounts.

NameRequiredDescriptionDefault
computer_nameYesComputer name to delete

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden, and it usefully states that the account and trust relationship are permanently removed. It still omits important destructive-operation context such as required permissions, confirmation expectations, and behavior when the account does not exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loads the purpose and destructive effect. The example is useful, though the final sentence is somewhat redundant with the earlier stale-account context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive one-parameter tool with no annotations and no output schema, the permanent deletion behavior is appropriately called out. It remains incomplete regarding permissions, failure modes, and prerequisites that an agent should know before deleting an AD computer account.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the single parameter is already documented as "Computer name to delete." The example shows usage but does not add format rules or meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: "Delete a computer object from Active Directory." It also clarifies that the account and trust relationship are permanently removed, but it does not explicitly distinguish itself from the sibling tool disable_computer.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The line "Cleans up stale computer accounts" implies a valid use case, and the example demonstrates invocation. However, it does not explicitly say when to choose delete_computer over disable_computer or when deletion should be avoided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_groupB

Delete a group from Active Directory.

Permanently removes the group object.

Example:

  • delete_group(group_name="Old Project Team")

Validates group existence before deletion.

NameRequiredDescriptionDefault
group_nameYesGroup name to delete

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It does disclose two useful traits, permanence and existence validation before deletion, but omits critical unknown-ables: required permissions, whether a group containing members can be deleted, what happens to members, and whether any confirmation is returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short lines, front-loaded with the verb and the permanence warning, and the example earns its space. Slightly loose formatting (the example block inside a one-parameter tool) but nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, unannotated tool with no output schema, the description covers the irreversibility and pre-flight validation but leaves the agent without prerequisites (permissions, non-empty group handling) or any indication of what a successful call returns. Adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single parameter, so the baseline applies. The example adds a little naming-convention context, but the description never resolves whether group_name is a display name, sAMAccountName, or distinguished name, which is the one ambiguity the schema leaves open.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Delete a group from Active Directory") and the delete-vs-create/modify distinction is self-evident from the verb against the sibling list. It does not name any sibling or scope boundary explicitly, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the destructive verb; there is no statement of when to prefer this over modify_group or remove_group_member, nor any exclusion like "use delete_group only after archiving." The example shows a call shape but not selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_organizational_unitA

Delete an Organizational Unit.

Removes OU and optionally all contained objects. Use with caution.

Example:

  • delete_organizational_unit(ou_dn="OU=OldDept,DC=company,DC=com", force=False)

Validates OU emptiness unless force deletion specified.

NameRequiredDescriptionDefault
forceNoForce deletion even if OU contains objects
ou_dnYesOU distinguished name to delete

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose that deletion removes the OU and optionally all contained objects, and that emptiness is validated unless force is set. It could go further by stating irreversibility or required permissions, but the key destructive behavior is surfaced.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and caution are front-loaded, and the example is useful for a deletion tool. It is slightly longer than necessary because the example repeats information already inferable from the schema, but it remains efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with no annotations and no output schema, the description covers the main behavior and force option but omits important operational context such as permission requirements and whether deletion is irreversible. It is adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already defines ou_dn and force. The description adds an example showing DN format and force usage, but does not add significant semantics beyond what the schema provides; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Delete an Organizational Unit.' It is clearly distinguishable from sibling delete tools such as delete_user, delete_group, and delete_computer because it names the OU object type directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a caution ('Use with caution') and explains the force condition, but does not say when to choose this tool versus alternatives like modify_organizational_unit or move_organizational_unit. The usage context is implied rather than explicitly routed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_userA

Delete a user account from Active Directory.

Permanently removes user account and all associated data. Use with caution.

Example:

  • delete_user(username="jsmith")

Validates user existence before deletion.

NameRequiredDescriptionDefault
usernameYesUsername to delete

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden, and it does disclose the most important traits: the deletion is permanent and cascades to associated data, plus existence validation occurs first. It omits permission/auth requirements and whether errors are returned for nonexistent users, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the destructive nature in two tight sentences, which is exactly the right ordering for a delete tool. The example block is mildly redundant for a single self-evident parameter, costing a point on economy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive tool with no output schema, the description supplies purpose, permanence, a precondition, and an example, which is essentially everything needed to invoke it correctly. Only permission/error semantics are missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With one parameter and 100% schema coverage, the baseline is 3, and the worked example (delete_user(username="jsmith")) adds concrete call syntax beyond the schema's bare 'Username to delete'. It doesn't describe username format or domain-qualification, so it earns above baseline but not full marks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Delete a user account from Active Directory') and immediately clarifies permanence and scope ('Permanently removes user account and all associated data'), which differentiates it from enable_user/disable_user without naming them. An agent can distinguish this from disable_user purely from the description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use with caution' implies this is a high-stakes operation, and 'Validates user existence before deletion' gives a usable precondition. However, it never explicitly names the alternative (disable_user) or states when-not-to-use, so selection between delete and disable is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

disable_computerA

Disable a computer account.

Deactivates computer account preventing domain authentication.

Example:

  • disable_computer(computer_name="DESKTOP-ABC123")

Useful for temporary computer isolation.

NameRequiredDescriptionDefault
computer_nameYesComputer name to disable

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose the concrete effect (authentication is blocked) and hints at reversibility via 'temporary' isolation, which is genuinely useful. However, it omits required permissions, whether existing sessions/logons are terminated, and how to undo it (enable_computer), leaving meaningful gaps for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and effect, then a compact example and one usage note. Slight redundancy between 'Disable a computer account' and 'Deactivates computer account', but nothing is wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation with no annotations and no output schema, the description covers purpose, effect, an example, and the use case. Only reversibility mechanics and permission requirements are missing, which is a minor gap at this complexity level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The inline example (computer_name="DESKTOP-ABC123") adds value beyond the schema by illustrating the expected name format, reducing the ambiguity between short name and distinguished name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Disable a computer account') and adds the distinguishing effect ('Deactivates computer account preventing domain authentication'), which separates it from delete_computer. It does not name sibling alternatives explicitly, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Useful for temporary computer isolation' implies the intended scenario but gives no when-not conditions and never points to alternatives such as delete_computer (permanent) or enable_computer (reversal). Usage is inferred rather than specified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

disable_userA

Disable a user account.

Deactivates a user account preventing login while preserving account data.

Example:

  • disable_user(username="jsmith")

Useful for temporary access suspension.

NameRequiredDescriptionDefault
usernameYesUsername to disable

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses that the operation prevents login and preserves account data, and 'temporary access suspension' implies reversibility. It still omits permissions required, active-session handling, and the exact response, but the core behavior is well explained.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and short, with a useful example. There is minor redundancy between 'Disable a user account' and 'Deactivates a user account,' but nothing is wasted overall.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity, single-parameter mutation tool with full schema coverage and no output schema, the description is largely complete: it explains the effect, usage context, and gives an example. The main remaining gap is operational context such as required permissions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single username parameter, so the schema already carries the parameter semantics. The example reinforces usage syntax but adds little beyond that, matching the baseline 3 for high coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource ('Disable a user account') and clarifies the effect ('preventing login while preserving account data'), which distinguishes it from delete_user. However, it does not explicitly name or differentiate against nearby siblings like enable_user or modify_user.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a clear usage context: 'Useful for temporary access suspension.' This tells the agent when to choose it, but it does not state when not to use it or explicitly point to enable_user for reversal or delete_user for permanent removal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

enable_computerB

Enable a computer account.

Activates disabled computer account allowing domain authentication.

Example:

  • enable_computer(computer_name="DESKTOP-ABC123")

Restores computer trust relationship.

NameRequiredDescriptionDefault
computer_nameYesComputer name to enable

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose the real-world effect (domain authentication is restored, the computer trust relationship is restored), which is valuable beyond a bare "enable" statement. However, it omits required permissions, behavior if the account is already enabled, and whether the change is reversible or audited.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core statement is front-loaded in the first two sentences and nothing is redundant. The example block is useful but takes extra vertical space for a one-parameter tool, keeping it just shy of a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter mutation with no output schema, the description covers purpose and effect adequately, but an agent still lacks error/failure context (unknown account, already-enabled account) and permission prerequisites, which matter for a state-changing directory operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single parameter, so the baseline is 3. The example call (computer_name="DESKTOP-ABC123") conveys the expected name format, which is a small addition over the schema's "Computer name to enable", but no constraints (length, FQDN vs short name, case) are stated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ("Enable a computer account") and adds the effect ("Activates disabled computer account allowing domain authentication"), so the operation is unmistakable. It does not name the obvious counterpart disable_computer, but the verb/resource pairing is distinct enough from siblings like modify_computer or reset_computer_password.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase "Activates disabled computer account" implies the condition under which to use it (the account is currently disabled), but there is no explicit when-not guidance, no mention of disable_computer as the inverse, and no prerequisites such as required permissions or that the account must exist.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

enable_userB

Enable a user account.

Activates a disabled user account by modifying the userAccountControl attribute.

Example:

  • enable_user(username="jsmith")

Allows user to log in and access domain resources.

NameRequiredDescriptionDefault
usernameYesUsername to enable

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full disclosure burden. It does well on the mechanism (userAccountControl mutation) and the resulting effect (login and domain access), but says nothing about required privileges, idempotency, or failure when the account is already enabled.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action, then the mechanism, then the outcome, with a compact example. No filler sentences, though the example line is a modest use of space for a single trivially-typed parameter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter mutation with no annotations and no output schema, the description covers what changes and what the user gains. It still omits permission prerequisites and the return/error shape, which an agent would need before calling it in an automated flow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% on the single username parameter, so the schema already documents it. The example call adds a small amount of value by showing the plain-username format with no domain prefix, but nothing beyond that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Enable a user account") and even names the underlying mechanism, modifying the userAccountControl attribute. The distinction from the sibling disable_user is only implicit in the naming, not stated outright, so it lands just short of the top mark.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by "Activates a disabled user account," which tells the agent the precondition is a currently disabled account. There is no explicit guidance on alternatives (e.g., modify_user) or what to do if the account is already enabled.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_computerB

Get detailed information about a specific computer.

Retrieves comprehensive computer information including OS details, last logon, group memberships, and security settings.

Example:

  • get_computer(computer_name="DESKTOP-ABC123")

Returns complete computer profile.

NameRequiredDescriptionDefault
attributesNoSpecific attributes to retrieve
computer_nameYesComputer name (sAMAccountName) to search for

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden. It does disclose the shape of the returned profile (OS details, last logon, group memberships, security settings), which is useful, but it says nothing about read-only nature, required permissions, or what happens when the computer is not found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded in the first sentence and the example is compact. The closing line 'Returns complete computer profile' largely restates the second sentence and earns little.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read tool with full schema coverage, the description covers what is fetched. It omits lookup-failure behavior and permissions, which matter for an agent calling against a directory service with no annotations to fall back on.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented and the baseline is 3. The worked example reinforces that computer_name takes a sAMAccountName value, but the optional 'attributes' filter is never mentioned in the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get detailed information about a specific computer') and the phrase 'specific computer' implicitly separates it from the sibling list_computers. It stops short of naming the alternative outright, so it is clear but not maximally distinguishing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: 'a specific computer' suggests a single-object lookup rather than a listing, and the example call shows the required identifier. There is no explicit when-to-use, when-not, or reference to list_computers as the alternative for enumeration.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_domain_infoB

Get domain information and security settings.

Retrieves domain configuration including password policies, lockout settings, and security parameters.

Example:

  • get_domain_info()

Returns comprehensive domain security posture.

NameRequiredDescriptionDefault

No parameters

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden. It implies a read operation but does not explicitly state read-only behavior, required permissions, whether the call is expensive, or what the response contains beyond a vague 'comprehensive domain security posture'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded, but it is repetitive: 'domain information and security settings', 'domain configuration', and 'comprehensive domain security posture' all restate the same idea without adding precision.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read tool with no output schema, the description gives a reasonable scope of the returned data but does not describe the shape or key fields of the response. It is adequate but leaves an agent guessing about the return structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to explain; the baseline for no-parameter tools is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (Get/Retrieves) and resource (domain information/configuration) and enumerates the data domains covered: password policies, lockout settings, and security parameters. This makes the tool distinguishable from user- and group-oriented siblings, though the overlap with get_password_policy_violations is not clarified.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to choose this tool over alternatives such as get_password_policy_violations or get_privileged_groups. The lone example 'get_domain_info()' only demonstrates the empty-argument call and does not explain usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_groupA

Get detailed information about a specific group.

Retrieves comprehensive group information including members, parent groups, and management settings.

Example:

  • get_group(group_name="Sales Team")

Returns group configuration and membership details.

NameRequiredDescriptionDefault
attributesNoSpecific attributes to retrieve
group_nameYesGroup name (sAMAccountName) to search for

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present the description must carry the behavioral burden; it does disclose what is returned (members, parent groups, management settings), which is valuable. It says nothing about permissions required, behavior when the group does not exist, or whether search is exact-match on sAMAccountName.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Short and front-loaded with the core purpose and return contents in the first two lines, followed by a concrete example. The first and second sentences overlap slightly ('detailed information' / 'comprehensive group information') but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description's summary of return contents (configuration and membership details) is necessary and adequate. The only real gap is failure/permission behavior for a lookup on a nonexistent group.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented in the schema. The description reinforces group_name via the example but adds no meaning for the 'attributes' projection parameter beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get detailed information about a specific group') and the elaboration (members, parent groups, management settings) makes clear this is a single-group detail read, not a listing. It does not explicitly name siblings like list_groups or get_group_members, so the differentiation is implied rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the example call and the word 'specific', which suggests it is for one named group rather than enumeration. There is no explicit guidance on when to prefer this over list_groups or get_group_members/get_nested_group_members.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_group_membersB

Get members of a group with optional recursion.

Lists all group members with option to include nested group members.

Example:

  • get_group_members(group_name="Sales Team")

  • get_group_members(group_name="All Users", recursive=True)

Shows detailed member information and nesting levels.

NameRequiredDescriptionDefault
recursiveNoInclude members of nested groups
group_nameYesGroup name to get members for

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden; 'Get' implies read-only but safety/mutation profile is never asserted. It gives partial output context ('detailed member information and nesting levels') but says nothing about permissions, pagination, or behavior with large/cyclic nested groups.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose line is good, but the second sentence restates it almost verbatim ('option to include nested group members'), and the trailing sentence about detailed member info is vague filler. Examples earn their place; the rest has redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-param read with no output schema and no annotations, the agent still lacks the return shape (what 'detailed member information' contains) and any resolution rule against the near-duplicate get_nested_group_members sibling. Adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters are self-documented, so baseline 3 applies. The examples add a little practical clarity about what recursive=True means (nested group members) but no format or edge-case detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb + resource ('Get members of a group') with the recursion scope stated up front, and worked examples of both modes. It does not, however, distinguish itself from the sibling get_nested_group_members, which sounds like it targets the same resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The examples imply when to set recursive=True vs. leave it off, so basic usage is inferable. There is no explicit when-not guidance and no routing between this tool and get_nested_group_members or get_group, which an agent will genuinely hesitate between.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_inactive_usersB

Get users who haven't logged in for specified days.

Identifies inactive user accounts that may pose security risks.

Example:

  • get_inactive_users(days=90, include_disabled=False)

Critical for security hygiene and compliance.

NameRequiredDescriptionDefault
daysNoNumber of days to consider inactive
include_disabledNoInclude disabled accounts in results

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry behavioral disclosure. It implies a read-only query and explains that disabled accounts are excluded by default, but says nothing about permissions required, result ordering, or the shape of the account objects returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by a short rationale and example, with no redundant clauses. The closing 'Critical for security hygiene and compliance' is mild filler but contributes usage framing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Two optional parameters, no nested objects, and no annotations make this a simple tool, and the description covers the query semantics. Without an output schema, however, it never says what an inactive user entry contains, leaving the return shape to guesswork.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented, making 3 the baseline. The description adds only a concrete example call (days=90, include_disabled=False) and the notion of a 'logged in' event, which is marginally more than the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get users who haven't logged in for specified days') with a clear scope (inactivity window). It is distinguishable from list_users by its inactivity filter, though it never explicitly contrasts itself with that sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The framing 'Identifies inactive user accounts that may pose security risks' and 'Critical for security hygiene and compliance' implies the usage context, and the example shows a typical call. However, it never states when not to use it or which sibling (list_users, get_stale_computers) is the alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_nested_group_membersA

Get all direct and nested members of a group.

Resolves the group by sAMAccountName and evaluates transitive membership on the domain controller in a single query (LDAP_MATCHING_RULE_IN_CHAIN), so deep or cyclic nesting is handled without client-side recursion. Results are confined to the configured base DN and capped by max_list_results (see "truncated").

Example:

  • get_nested_group_members(group_name="Domain Admins")

Returns members with dn, sAMAccountName, displayName and type.

NameRequiredDescriptionDefault
group_nameYesGroup name (sAMAccountName) whose nested members to list

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the server-side LDAP_MATCHING_RULE_IN_CHAIN evaluation, handling of deep/cyclic nesting without client recursion, base-DN confinement, and truncation via 'truncated'. It omits read-only confirmation, permission requirements, and latency/cost expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, followed by mechanism, scope, and return shape; the example earns its place. Slightly wordy in the mechanism sentence but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with no output schema, the description covers return fields (dn, sAMAccountName, displayName, type), truncation signaling, and scope boundaries. What remains unstated is permission requirements and what happens when the group name does not resolve.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter already documents that group_name is a sAMAccountName, so the description adds little beyond the schema. The example reinforces the expected value shape but introduces no new semantics such as DN vs name forms or error behavior for unresolved groups.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get all direct and nested members of a group') and the qualifier 'nested' implicitly distinguishes it from the sibling get_group_members. It never names that sibling explicitly, so the differentiation must be inferred rather than read.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The example shows a canonical call and the description bounds results to the base DN and max_list_results, which implies when the tool fits. However, it never says when to prefer this over get_group_members or get_user_groups, leaving the agent to infer the distinction from the word 'nested'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_organizational_unitB

Get detailed information about a specific OU.

Retrieves comprehensive OU information including child objects, GP links, and management settings.

Example:

  • get_organizational_unit(ou_dn="OU=Sales,DC=company,DC=com")

Returns complete OU configuration.

NameRequiredDescriptionDefault
ou_dnYesDistinguished name of the OU
attributesNoSpecific attributes to retrieve

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses that the tool returns comprehensive OU configuration, including child objects and GP links, but does not mention permissions, error behavior, pagination, or output format details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loads the main purpose. The example is useful, though the repeated phrases about detailed, comprehensive, and complete OU information are somewhat redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only lookup tool with no output schema, the description adequately describes the broad return contents. However, it does not clarify the distinction from get_organizational_unit_contents or explain how the optional attributes parameter changes the response, leaving gaps for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented in the input schema. The description adds an example DN format for ou_dn, which is helpful, but it does not explain the attributes parameter or otherwise add meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource: get detailed information about a specific OU. It also names the kinds of data returned, including child objects, GP links, and management settings. It does not explicitly distinguish this from the close sibling get_organizational_unit_contents, which may also return child objects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides an example call but no explicit guidance on when to use this tool instead of list_organizational_units or get_organizational_unit_contents. The example implies lookup by DN for a single OU, but alternatives and exclusions are left unstated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_organizational_unit_contentsA

Get contents of an OU.

Lists all objects within OU including users, groups, computers, and sub-OUs.

Example:

  • get_organizational_unit_contents(ou_dn="OU=Sales,DC=company,DC=com")

  • get_organizational_unit_contents(ou_dn="OU=IT,DC=company,DC=com", object_types=["user", "group"])

Provides OU inventory and organization.

NameRequiredDescriptionDefault
ou_dnYesOU distinguished name
object_typesNoTypes of objects to include

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the full behavioral load. It does disclose scope (sub-OUs appear as listed objects), but leaves open whether the contents of sub-OUs are recursed into, what permissions are required to read an OU, and how large a result set can get — all material for a directory listing tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first line, followed by a compact enumeration and two short examples. It is slightly padded by the trailing 'Provides OU inventory and organization' sentence, which restates what was already said.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with no output schema and no annotations, the description covers what the tool returns and how to filter adequately. The main shortfall is the unresolved question of recursion depth into sub-OUs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so baseline is 3. The description goes beyond the schema's bare 'Types of objects to include' by showing concrete values like ["user", "group"], which adds practical meaning the schema does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get contents of an OU') and enumerates what is returned: users, groups, computers, and sub-OUs. This makes it distinguishable from list_users or get_organizational_unit, though it never explicitly contrasts itself with those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The two examples show realistic invocations, including how to narrow results with object_types, which implies the filtering use case. However, there is no explicit when-to-use guidance and no mention of when to prefer get_organizational_unit or list_users instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_password_policy_violationsA

Get users with password policy violations.

Identifies accounts with password policy non-compliance including expired passwords, never-expiring passwords, and policy violations.

Example:

  • get_password_policy_violations()

Essential for password security compliance.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses the categories of violations found, which is useful, but does not clarify that this is a read-only operation, whether any permissions are required, or what the result shape looks like.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and short. The example line and 'Essential for password security compliance' are somewhat redundant but not harmful; the core purpose appears in the first sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and no output schema, the description is only partially complete. It explains what the tool identifies but does not describe the returned user fields or confirm read-only behavior, leaving some gaps for an agent invoking it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there are no parameter semantics to explain. The baseline for a parameterless tool is 4, and the description correctly presents the call with an empty argument list.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get users with password policy violations.' It further clarifies the scope by naming expired passwords, never-expiring passwords, and policy violations, which distinguishes it from generic user-listing siblings like list_users or get_inactive_users.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied through 'Essential for password security compliance,' but the description does not explicitly say when to choose this over adjacent tools such as get_inactive_users or audit_admin_accounts, nor does it state exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_privileged_groupsB

Get information about privileged groups.

Identifies and analyzes high-privilege groups including Domain Admins, Enterprise Admins, and other administrative groups.

Example:

  • get_privileged_groups()

Essential for security auditing and compliance.

NameRequiredDescriptionDefault

No parameters

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden, yet it never confirms this is a read-only operation, what scope it searches (domain vs. forest), or whether results are recursive. 'Identifies and analyzes' hints at computation but says nothing about output shape or cost.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening line is front-loaded and clear, but the second sentence largely restates it, and the 'Example: get_privileged_groups()' block conveys nothing for a zero-argument tool. Meaningful content could be compressed to one sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations and no output schema, the description must compensate, and the biggest gap is the return value: an agent doesn't know whether it gets group names, member counts, or risk scores. It is adequate to know what the tool is for, but thin on what to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, which is the baseline-4 case; there are no argument semantics to mis-document. The empty schema means nothing is left ambiguous for the caller.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb ('Get information about') and a well-scoped resource ('privileged groups'), reinforced by concrete examples (Domain Admins, Enterprise Admins). It is narrower than generic siblings like list_groups or get_group, though it never explicitly contrasts itself with audit_admin_accounts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only usage signal is the tail phrase 'Essential for security auditing and compliance', which is a generic endorsement rather than a when-to-use rule. It gives no guidance on choosing this over audit_admin_accounts, get_user_permissions, or get_group_members, all of which plausibly overlap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_rootdse_infoA

Get rootDSE information from the domain controller.

Returns naming contexts, DC host name, functional levels, supported LDAP versions and SASL mechanisms, current time and sync/global-catalog state. Takes no input; a fixed attribute allow-list is read.

Example:

  • get_rootdse_info()

Useful to confirm which DC answered and its functional level.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the load and does reasonably well: it declares there is no input, that a fixed attribute allow-list is read (a real behavioral constraint that prevents the agent from requesting arbitrary attributes), and lists what comes back. It omits authentication/bind requirements and any failure behavior, which is the remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: purpose first, then return contents, then the no-input constraint, then a concrete example call and a one-line use case. No redundant restatement of the name and nothing wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description does the necessary work by enumerating the returned fields (naming contexts, DC host name, functional levels, LDAP versions, SASL mechanisms, time, sync/GC state). What's missing is bind/anonymous-auth expectations and error conditions, minor for a read-only diagnostic call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the description confirms this explicitly ("Takes no input"), plus notes the fixed allow-list that shapes the call. Baseline for a zero-parameter tool is 4, and nothing here detracts from that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource (rootDSE information from the domain controller) and enumerates the returned attributes, so the agent knows exactly what it gets. It does not explicitly distinguish itself from the nearby get_domain_info, get_schema_info, or test_connection siblings, which is the only thing keeping it from a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

One use case is stated ("Useful to confirm which DC answered and its functional level"), which is genuinely helpful context. However there is no indication of when NOT to use it, nor any pointer to the alternatives (get_domain_info, test_connection, health) that an agent could easily confuse it with, so routing remains partly inferential.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_schema_infoB

Get schema information for all available tools.

Retrieves comprehensive information about all tools, their parameters, and capabilities.

Example:

  • get_schema_info()

Useful for API documentation and integration.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the full behavioral burden. It discloses that the tool returns comprehensive information about all tools, their parameters, and capabilities, but says nothing about output format, size, auth requirements, or that it is a read-only operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening two sentences are front-loaded and efficient. However, the example line '- get_schema_info()' adds no information for a zero-parameter tool, and the closing sentence is vague filler, so the description is not as tight as it could be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description should explain return values more concretely. It states the tool returns comprehensive tool, parameter, and capability information, which is directionally useful, but an agent still lacks structure/format details needed to consume the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema is empty with 100% description coverage. The baseline for a parameterless tool is 4; no additional parameter semantics are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') and resource ('schema information for all available tools') and clarifies that it covers parameters and capabilities. It is clearly a meta/introspection tool, distinct from all the AD object-management siblings, though 'schema information' is slightly abstract until the second sentence.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only usage signal is 'Useful for API documentation and integration,' which implies a context but does not specify when to call it, when not to, or alternatives. Usage is implied rather than explicitly guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_stale_computersA

Get computers that haven't logged in for specified days.

Identifies inactive computer accounts that may need cleanup.

Example:

  • get_stale_computers(days=90)

Helps maintain clean computer account inventory.

NameRequiredDescriptionDefault
daysNoNumber of days to consider stale

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full behavioral burden. It implies a read-only identification operation ('may need cleanup' suggests the cleanup itself happens elsewhere) and specifies what constitutes staleness, but says nothing about required permissions, return volume, or pagination behavior for a potentially large account inventory.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core definition is front-loaded and the example is useful. The trailing sentence 'Helps maintain clean computer account inventory' largely repeats 'may need cleanup' and could be dropped without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with no output schema, the description covers what is queried and the staleness threshold well enough. It omits what fields are returned per computer, a minor gap given there is no output schema to fall back on.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the 'days' parameter is already documented as 'Number of days to consider stale.' The description reinforces this with 'for specified days' and an example (days=90), matching the schema default, but adds no new semantic detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get computers that haven't logged in for specified days.' The resource (computer accounts) is clear and distinguishes it from the sibling get_inactive_users without naming that sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Identifies inactive computer accounts that may need cleanup' implies the use case of finding accounts to clean up, and the example illustrates a typical call. However, it never states when to prefer this over list_computers or get_computer, and provides no exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tls_postureA

Report the TLS posture of the connection to the domain controller.

Returns the configured values (use_ssl, ssl_port, enable_tls, validate_certificate, whether a CA file is set, require_secure_connection), the live channel (ldaps, starttls or plaintext, plus TLS version and cipher when available) and a list of findings {severity, code, message}. Takes no input; no secrets or paths are returned.

Example:

  • get_tls_posture()

Useful to verify that the bind is encrypted and the certificate is validated.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the three return components (configured values, live channel, findings) and explicitly states that no secrets or paths are returned, which tells the agent this is a safe, non-leaking read. The read-only nature is implied rather than declared, and no rate-limit or failure-mode context is given, keeping it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentence is front-loaded and the field enumeration is efficiently presented. However, the example 'get_tls_posture()' adds nothing for a zero-argument tool, and 'Takes no input' partly repeats the empty schema, so a small amount of text does not earn its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must explain returns — and it does, listing the configured keys, the live channel with TLS version and cipher, and the findings shape {severity, code, message}. Combined with the zero-parameter nature and the no-secrets guarantee, an agent has everything it needs to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters means the baseline is 4, and the description reinforces this with 'Takes no input.' Nothing further about parameters is required or missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Report the TLS posture of the connection to the domain controller,' and the following sentence enumerates exactly what posture means (configured values, live channel, findings). No sibling tool overlaps this scope, so an agent can distinguish it immediately from the AD administration tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Useful to verify that the bind is encrypted and the certificate is validated' gives a clear condition for calling it, and 'Takes no input' rules out prerequisite discovery. There are no explicit exclusions or named alternatives, but none are needed given it is the only TLS-posture tool in the set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_userA

Get detailed information about a specific user.

Retrieves comprehensive user information including attributes, group memberships, account status, and computed security fields.

Example:

  • get_user(username="jsmith")

Returns detailed user profile with security assessment.

NameRequiredDescriptionDefault
usernameYesUsername (sAMAccountName) to search for
attributesNoSpecific attributes to retrieve

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden. It usefully discloses what comes back ('security assessment', computed fields) but never states that this is a read-only operation, what permissions are required, or what happens when the username does not exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, followed by a field inventory and a compact example. There is mild redundancy between 'detailed information' and 'comprehensive user information', but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description adequately sketches the return value and gives a usage example for a simple two-parameter read tool. The missing pieces are operational details (permissions, not-found behavior) rather than anything that prevents a correct call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters are documented there, so the baseline is 3. The description adds a concrete example of the required username but says nothing about the optional attributes parameter or its expected format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get detailed information about a specific user') and enumerates the payload (attributes, group memberships, account status, computed security fields), which implicitly separates it from list_users. It never names a sibling explicitly, so the differentiation is inferred rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the example call; there is no guidance on when to prefer this over get_user_groups, get_user_permissions, or list_users, and no exclusions or prerequisites (e.g. required permissions) are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_user_groupsC

Get groups that a user is member of.

Retrieves detailed group membership information including group types, scopes, and descriptions.

Example:

  • get_user_groups(username="jsmith")

Returns comprehensive group membership analysis.

NameRequiredDescriptionDefault
usernameYesUsername to get groups for

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses that detailed membership information is returned, including group types, scopes, and descriptions, but does not clarify whether this includes only direct membership or also nested/transitive groups, nor does it mention permissions, pagination, or account-scope constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loads the core purpose, followed by useful detail and an example. The final sentence, 'Returns comprehensive group membership analysis,' is vague and does not earn its place, but overall the structure is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read operation, the description is mostly adequate and explains the type of data returned. However, without annotations or an output schema, it should resolve whether nested membership is included, especially given the sibling get_nested_group_members tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one parameter, and its schema description coverage is 100%, so the schema already defines 'username' fully. The description's example adds a concrete usage form but does not significantly extend parameter semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: getting the groups a user belongs to. It is clear on its own, but it does not explicitly distinguish itself from the inverse sibling get_group_members or from get_nested_group_members.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an example invocation but no guidance on when to use this tool versus alternatives like get_group_members (group-to-user lookup) or get_nested_group_members (nested membership). The agent must infer the appropriate use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_user_permissionsC

Get effective permissions for a user.

Analyzes user's effective permissions through group memberships and identifies potential security risks.

Example:

  • get_user_permissions(username="jsmith")

Provides security risk assessment.

NameRequiredDescriptionDefault
usernameYesUsername to analyze permissions for

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full disclosure burden. It implies a read-only analysis but never confirms it, and says nothing about permissions required, whether it traverses nested groups, how expensive the analysis is, or what the 'security risk assessment' actually returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentence is well front-loaded, but the body repeats itself: 'identifies potential security risks' and 'Provides security risk assessment' say the same thing twice. One of those sentences could be replaced with genuinely useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, non-destructive lookup with no output schema, the description covers the basic purpose and hints at a risk-assessment output. But with no annotations and no output schema, the agent is left unsure what the response contains and how it differs from get_user_groups.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single required parameter with 100% schema description coverage ('Username to analyze permissions for'), so the schema already does the work. The example (username="jsmith") reinforces format slightly but adds no new semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource ('Get effective permissions for a user') and adds a secondary capability ('identifies potential security risks'). However, it does not differentiate itself from the close sibling get_user_groups, which also covers group-derived access, so the distinction between 'permissions' and 'groups' is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description never states when to use this tool instead of alternatives such as get_user_groups, audit_admin_accounts, or get_privileged_groups, even though these clearly overlap. The example only shows syntax, not a decision context, so no real usage guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

healthA

Health check for Active Directory MCP server.

Returns server status, LDAP connectivity, and system health information.

Example:

  • health()

Essential for monitoring and alerting.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the burden; it does convey that this is a non-mutating status probe returning three categories of information, which is the key behavioral fact. It omits any mention of cost, latency, or whether failures surface as errors versus degraded status values.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by return summary and a one-line example; nothing is redundant. The example for a zero-arg call is slightly ceremonial but harmless.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does well to enumerate the returned fields, but it leaves unresolved how this differs from other diagnostic siblings (test_connection, get_rootdse_info, get_domain_info) — the main ambiguity an agent faces in this 40+ tool list.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline applies. The example call correctly shows an empty argument list.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Health check for Active Directory MCP server') and enumerates what it reports: server status, LDAP connectivity, system health. However, it never distinguishes itself from siblings like test_connection or get_domain_info, which plausibly overlap with 'LDAP connectivity' reporting.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Essential for monitoring and alerting' implies a usage context (operational monitoring) but gives no explicit when-to-use versus test_connection, nor any exclusions. The agent must infer the boundary itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_computersB

List computer objects in Active Directory.

Retrieves computer accounts with operating system information, last logon, and security status.

Example:

  • list_computers()

  • list_computers(ou="OU=Workstations,DC=company,DC=com")

Shows computer health and security posture.

NameRequiredDescriptionDefault
ouNoOrganizational Unit DN to search in
attributesNoSpecific attributes to retrieve
filter_criteriaNoAdditional LDAP filter criteria

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses the returned fields (OS, last logon, security status), which tells the agent the call is a read with meaningful payload. It does not say what happens when 'ou' is omitted (whole domain scan?), whether results are paged or size-limited, or what permissions are required — all relevant for a potentially large directory read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, followed by return contents and compact examples. The closing line 'Shows computer health and security posture' largely restates the earlier field list and is the one sentence that does not earn its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter read tool with no annotations and no output schema, the description covers purpose and return fields but omits default scope behavior, result volume expectations, and permission prerequisites. Adequate, but with clear gaps an agent would want filled.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters are documented in the schema itself. The description only illustrates 'ou' in an example and does not add semantics for 'attributes' or 'filter_criteria', so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List computer objects in Active Directory') and enumerates what is returned: OS information, last logon, security status. It does not, however, distinguish itself from nearby siblings such as get_computer (single object) or get_stale_computers, so the agent must infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The two examples imply how to call it with and without an OU scope, which is a form of usage guidance. But there is no explicit when-to-use/when-not and no mention of when get_computer or get_stale_computers would be the better choice, leaving the choice to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_groupsB

List groups in Active Directory with filtering options.

Retrieves security and distribution groups with detailed information about scope, type, and membership counts.

Example:

  • list_groups()

  • list_groups(ou="OU=Security Groups,DC=company,DC=com")

  • list_groups(filter_criteria="(groupType=-2147483646)")

Shows group hierarchy and management information.

NameRequiredDescriptionDefault
ouNoOrganizational Unit DN to search in
attributesNoSpecific attributes to retrieve
filter_criteriaNoAdditional LDAP filter criteria

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does disclose what comes back (scope, type, membership counts, hierarchy), but says nothing about permissions required, result-size limits, pagination, or whether membership counts are computed at extra cost — notable gaps for an LDAP query tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentence is front-loaded and the examples earn their space. The closing line 'Shows group hierarchy and management information' is vague filler that restates the earlier membership/scope claim, and the hard line wrapping adds noise without structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description partially compensates by sketching the returned fields. It still leaves the agent guessing on paging/limits, the purpose of 'attributes', and how this differs from the group-member and privileged-group tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The examples do add real value by showing that filter_criteria takes raw LDAP syntax like '(groupType=-2147483646)' and that ou takes a full DN, but the 'attributes' parameter is never mentioned or illustrated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List groups in Active Directory') and adds scope detail — security vs. distribution groups, with scope/type/membership counts. The plural 'list' contrasts implicitly with the singular get_group and with get_group_members, but no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Three concrete call examples imply the usage patterns (no args, scoped to an OU, LDAP-filtered), which is more than generic guidance. However, nothing states when to prefer get_group, get_group_members, or get_privileged_groups instead, and there are no exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_organizational_unitsC

List Organizational Units in Active Directory.

Retrieves OU hierarchy with management information and policy links.

Example:

  • list_organizational_units()

  • list_organizational_units(parent_ou="OU=Departments,DC=company,DC=com", recursive=True)

Shows OU structure and relationships.

NameRequiredDescriptionDefault
parent_ouNoParent OU DN to search in
recursiveNoSearch recursively in sub-OUs
attributesNoSpecific attributes to retrieve
filter_criteriaNoAdditional LDAP filter criteria

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions that the tool retrieves hierarchy, management information, and policy links, but it does not state permission requirements, pagination, performance implications, or the exact return format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and uses compact, useful examples. The final sentence restates that it shows OU structure and relationships, adding slight redundancy, but overall it is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter read tool with full schema coverage but no annotations or output schema, the description covers the broad purpose and gives examples. However, it lacks sibling differentiation and does not describe the return shape or important behavioral details, leaving meaningful gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters are already documented in the input schema. The description reinforces parent_ou and recursive through examples, but it does not add meaning for attributes or filter_criteria beyond what the schema provides, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: listing Organizational Units in Active Directory, and adds that it retrieves OU hierarchy with management information and policy links. It is clear, but it does not explicitly distinguish itself from siblings such as get_organizational_unit or get_organizational_unit_contents.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The examples show how to call the tool with parent_ou and recursive, but they do not explain when to use this tool instead of alternatives like get_organizational_unit or get_organizational_unit_contents. There are no stated exclusions or conditions for choosing this listing tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_usersA

List users in Active Directory with optional filtering.

This tool retrieves users from the specified organizational unit or entire domain. Supports custom LDAP filters and attribute selection for targeted queries.

Example:

  • List all users: list_users()

  • List users in specific OU: list_users(ou="OU=Sales,DC=company,DC=com")

  • List with filter: list_users(filter_criteria="(department=IT)")

Returns user information including account status, group memberships, and security details.

NameRequiredDescriptionDefault
ouNoOrganizational Unit DN to search in
attributesNoSpecific attributes to retrieve
filter_criteriaNoAdditional LDAP filter criteria

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden. It does disclose that the default scope is the entire domain and that results include account status, group memberships and security details, but it says nothing about result size limits, pagination, or required permissions — significant for a domain-wide listing that can return thousands of entries.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and scope, followed by compact schema-relevant examples. The line "Supports custom LDAP filters and attribute selection for targeted queries" partially restates the examples, but no sentence is seriously wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully summarizes returned fields, and with zero required parameters it conveys that all arguments are optional. However, it omits result-volume and paging behavior, which is the main risk an agent faces when calling a domain-wide user listing with no annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, and the description goes beyond it by demonstrating the DN syntax for `ou` ("OU=Sales,DC=company,DC=com") and LDAP filter syntax for `filter_criteria` ("(department=IT)"). `attributes` is only echoed, not illustrated, so it stops short of a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ("List users in Active Directory") and clarifies scope via "specified organizational unit or entire domain." It is distinguishable from get_user (single user) and the narrower siblings like get_inactive_users, though it never names those siblings explicitly to sharpen the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The three worked examples show concrete invocation contexts (all users, OU-scoped, filtered), which is better than implied usage. But there is no guidance on when to prefer a sibling such as get_user or get_inactive_users, and no exclusions or preconditions (connection/auth) stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modify_computerC

Modify computer attributes and properties.

Updates computer information including description, location, and management settings.

Example:

  • modify_computer(computer_name="DESKTOP-ABC123", attributes={"description": "Updated description", "location": "Building A"})

Returns an error if the computer is not found.

NameRequiredDescriptionDefault
attributesYesDictionary of attributes to modify
computer_nameYesComputer name to modify

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses one error condition (computer not found), which is useful, but says nothing about required permissions, whether the attributes dict is a partial merge or a full replace, which keys are accepted, or whether the change is auditable/reversible. For a mutation tool with zero annotation coverage that is a significant gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first two sentences say essentially the same thing and could be one, but the worked example with a realistic computer_name is genuinely useful and correctly illustrates the nested attributes shape. Net is serviceable rather than tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A write tool with a nested free-form attributes object, no annotations, and no output schema needs the description to spell out accepted keys and update semantics; it does neither. The error-on-not-found note is the only behavioral detail and is insufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, and the description does add partial meaning by naming example attribute keys (description, location, management settings). However, the nested attributes object is the risky parameter and its accepted key set is never enumerated, so it barely exceeds the schema's "Dictionary of attributes to modify".

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Modify computer attributes and properties") and narrows the scope to computers, which distinguishes it from modify_user and modify_group. It does not, however, clarify how it relates to enable_computer/disable_computer/reset_computer_password, which touch the same object.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance and no mention of alternatives. The description never says to use enable_computer/disable_computer for status changes or reset_computer_password for credentials, so the agent must infer boundaries from sibling names alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modify_groupC

Modify group attributes and properties.

Updates group information including description, managed by settings, and other attributes.

Example:

  • modify_group(group_name="Sales Team", attributes={"description": "Updated description"})

Returns an error if the group is not found.

NameRequiredDescriptionDefault
attributesYesDictionary of attributes to modify
group_nameYesGroup name to modify

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full behavioral burden. It does disclose one useful trait — an error is returned if the group is not found — but says nothing about required authorization, whether unspecified attributes are preserved or wiped, or whether changes are reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the verb+resource and backed by a concrete example, but the second sentence ('Updates group information including description, managed by settings, and other attributes') largely restates the first while adding only vague filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a mutation tool with zero annotations, no output schema, and an open-ended nested object parameter. The description should therefore explain valid attribute keys, permission requirements, and mutation semantics, but covers only the not-found error.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are documented, establishing a baseline of 3. The description adds marginal value by naming a sample attribute key ('description') and showing the expected shape of the attributes dictionary, but never enumerates which attribute keys are valid for a nested object.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (modify) and resource (group), and the example clarifies that it patches attributes on an existing group. It is distinguishable from create_group/delete_group/get_group by name and example, though the description never explicitly contrasts itself with those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this versus create_group, add_group_member, or modify_user, nor any prerequisite such as required permissions. The example shows one invocation form but does not establish usage conditions or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modify_organizational_unitB

Modify OU attributes and properties.

Updates OU information including description, managed by, and location details.

Example:

  • modify_organizational_unit(ou_dn="OU=Sales,DC=company,DC=com", attributes={"description": "Updated description"})

Returns an error if the OU is not found.

NameRequiredDescriptionDefault
ou_dnYesOU distinguished name to modify
attributesYesDictionary of attributes to modify

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden, yet it only discloses one behavioral fact (error when the OU is not found). It never says whether the attributes dictionary is a merge or a full replace, what happens to keys omitted from the call, whether unknown attribute names are rejected, or what permissions are required for a directory mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and scope are front-loaded, and the example is compact and directly usable. The opening two sentences restate each other slightly ('Modify OU attributes and properties' / 'Updates OU information including...'), which is minor redundancy but not bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations, no output schema, and a free-form nested object parameter, the description covers purpose, an example, and the not-found failure mode. It stops short on the things an agent most needs before writing: merge-vs-replace semantics, validation of attribute names, and permission requirements.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description goes further: the example shows the DN string format for ou_dn and demonstrates that attributes is a name-to-value mapping, and it names concrete accepted keys (description, managed by, location). The word 'including' leaves the full key set open, which keeps it short of a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (modify) and resource (OU attributes/properties), which clearly separates it from siblings like move_organizational_unit, delete_organizational_unit, and create_organizational_unit. It does not explicitly name those siblings, so differentiation is implicit in the verb rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the worked example shows the intended shape of a call and the final line notes the not-found error case, but there is no statement of when to prefer this over move_organizational_unit or modify_group/modify_user analogues. An agent can infer context but is given no exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modify_userA

Modify user attributes and properties.

Updates existing user attributes including personal information, security settings, and organizational data.

Example:

  • modify_user(username="jsmith", attributes={"department": "Marketing", "title": "Manager"})

The password cannot be changed with this tool; use reset_user_password instead.

NameRequiredDescriptionDefault
usernameYesUsername to modify
attributesYesDictionary of attributes to modify

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses one important constraint (no password changes) and implies merge semantics via "attributes to modify," but omits permission requirements, whether omitted or null attributes are left untouched or cleared, behavior on a nonexistent username, and reversibility of security-setting changes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, followed by useful scope and the worked example. The second paragraph ("Updates existing user attributes including personal information, security settings, and organizational data") largely restates the opening line, so a sentence could be trimmed, but nothing is misleading.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with a free-form nested attributes object, no annotations, and no output schema, the description leaves significant surface uncovered: which attribute keys are accepted, how invalid keys are handled, and what the response contains. The password exclusion and example are helpful, but an agent could still call this with wrong key names and no warning.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline 3 applies, but the description adds real value beyond the schema: "attributes" is a free-form nested object with no enum or key whitelist, and the example modify_user(username="jsmith", attributes={"department": "Marketing", "title": "Manager"}) demonstrates the expected key/value shape an agent could not infer from "Dictionary of attributes to modify."

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Modify user attributes and properties") and scopes it to existing users, which distinguishes it from create_user and delete_user. It does not explicitly contrast with modify_group/modify_computer or enable/disable_user, but the resource noun does the separating work.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit exclusion with the correct alternative: "The password cannot be changed with this tool; use reset_user_password instead." That is a genuine when-not plus named alternative. It stops short of stating general preconditions (e.g. user must exist, permissions needed) or when to prefer enable/disable_user for account state.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

move_organizational_unitB

Move an OU to a new parent.

Relocates OU within domain hierarchy while preserving contents.

Example:

  • move_organizational_unit(ou_dn="OU=Sales,OU=Old,DC=company,DC=com", new_parent_dn="OU=Departments,DC=company,DC=com")

Maintains OU relationships during move.

NameRequiredDescriptionDefault
ou_dnYesOU distinguished name to move
new_parent_dnYesNew parent OU distinguished name

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that contents are preserved and OU relationships are maintained during the move, which is useful behavioral context. However, it omits critical details like required permissions, whether the move is reversible, and error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and uses an example effectively. The final sentence 'Maintains OU relationships during move' is slightly redundant with 'preserving contents' but overall the text is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations and no output schema, the description covers the key behavior (preservation of contents and relationships) but lacks important context such as permission requirements, failure modes, and whether moves across domains are allowed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the input schema already documents both parameters fully. The example reinforces the usage of ou_dn and new_parent_dn but adds no new semantic meaning beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Move an OU to a new parent.' It clearly conveys the action, but does not differentiate from sibling tools like modify_organizational_unit, which might also alter OU properties.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

An example demonstrates how to call the tool, implying usage, but there is no explicit guidance on when to use this versus modify_organizational_unit or other OU tools, nor any stated prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_group_memberB

Remove a member from a group.

Removes specified member from group membership.

Example:

  • remove_group_member(group_name="Sales Team", member_dn="CN=John Smith,OU=Users,DC=company,DC=com")

Validates membership before removal.

NameRequiredDescriptionDefault
member_dnYesDistinguished name of member to remove
group_nameYesGroup name to remove member from

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description bears the full burden. It does disclose one real behavioral trait, 'Validates membership before removal', but omits whether a non-member causes an error, whether the operation is idempotent, what permissions are required, and whether removal is reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The example and validation note are useful and front-loaded, but the first two sentences say the same thing twice ('Remove a member from a group' / 'Removes specified member from group membership'), wasting space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter mutation with full schema coverage, the description is close to sufficient, but with no annotations and no output schema it should say more about error behavior and permissions before an agent can call it confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented, giving a baseline of 3. The worked example does add useful format context by showing a concrete DN string, but no constraints (e.g. DN syntax rules, escaping) are elaborated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: remove a member from a group. An agent can distinguish it from add_group_member and get_group_members without opening the schema, though it never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this versus alternatives such as modify_group, and no stated prerequisites (required permissions, whether the caller must be an owner). Usage is only implied by the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reset_computer_passwordA

Reset computer account password.

Sets a new random 120-character machine password on the computer account (unicodePwd) and returns it once in the response (sensitive; do not log it). Requires an LDAPS/StartTLS connection; refused otherwise. The machine's secure channel breaks, so it must be rejoined or re-synced.

Example:

  • reset_computer_password(computer_name="DESKTOP-ABC123")

Returns an error if the computer is not found.

NameRequiredDescriptionDefault
computer_nameYesComputer name to reset password for

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden and does so: it discloses the password is random and 120 characters, returned exactly once in the response, flagged sensitive (do not log), that TLS is mandatory and the call is refused otherwise, and that the machine's secure channel breaks and must be rejoined or re-synced. These are exactly the side effects an agent must know before invoking.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded in the first line, followed by constraints and consequences in short declarative sentences; nothing is padded. The example line is useful but slightly redundant given a single obvious parameter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter mutation with no output schema and no annotations, the description covers prerequisites (TLS), the return value and its sensitivity, the destructive side effect on the secure channel, and the error case. An agent has everything needed to call it correctly and handle the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter is already documented as 'Computer name to reset password for'. The description adds only an example invocation, which is helpful but does not add semantic constraints (e.g. whether short name or FQDN or DN is accepted).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Reset computer account password') and immediately distinguishes it from the sibling reset_user_password by naming the object type (computer account) and the underlying attribute (unicodePwd). An agent can tell exactly which of the two reset tools to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is clear: it applies to computer accounts, requires an LDAPS/StartTLS connection, and errors if the computer is not found. It does not explicitly contrast with reset_user_password or say when *not* to use it, so it falls short of a full when/when-not/alternatives statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reset_user_passwordB

Reset user password with optional auto-generation.

Resets user password to specified value or generates secure random password. Optionally forces password change at next logon.

Example:

  • reset_user_password(username="jsmith", force_change=True)

  • reset_user_password(username="jsmith", new_password="NewPass123!")

Generated passwords meet complexity requirements.

NameRequiredDescriptionDefault
usernameYesUsername to reset password for
force_changeNoForce user to change password at next logon
new_passwordNoNew password (auto-generated if not provided)

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It is a security-sensitive mutation that changes a user's credentials, yet the description does not disclose required permissions, whether existing sessions are invalidated, whether the operation is reversible, or how a generated password is returned to the caller. It does add useful behavior around complexity requirements and forced next-logon change.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and is largely waste-free. The example block is useful but slightly verbose relative to the short explanatory text; overall structure is clear and easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter mutation tool with no output schema and no annotations, the description covers the main action and password generation. The major gap is that it does not explain how the generated password is communicated back to the caller, nor does it mention authorization requirements or side effects, which an agent needs before invoking a credential reset.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameter meanings are already documented by the schema. The description reinforces the auto-generation-as-default behavior and provides examples that map arguments to common scenarios, but adds little beyond the schema's existing parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: reset a user password, including the optional auto-generation behavior and forced change. It is clearly distinct from non-user reset tools such as reset_computer_password, though it does not explicitly reference sibling alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied through examples showing either auto-generated or specified password flows, which clarifies common invocation patterns. However, it does not state when to use this tool versus modify_user or why one would choose an explicit password over auto-generation, nor does it mention prerequisites such as required administrative permissions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

test_connectionB

Test LDAP connection and get server information.

Validates Active Directory connectivity and retrieves server status.

Example:

  • test_connection()

Useful for troubleshooting and monitoring.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden. It implies a read-only connectivity probe and mentions connectivity validation, but says nothing about timeout behavior, whether a failed connection raises an error or returns a status value, or what 'server information' actually contains — all critical for a test/health style tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening two lines are front-loaded and efficient, but the 'Example: - test_connection()' block is pure filler for a zero-argument tool and adds no information. Roughly a third of the description earns no place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations and no output schema, the description should explain what a successful result looks like and how failure is surfaced. It gestures at 'server status' but leaves the return shape and error contract unspecified, which is the main gap an agent would hit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the description correctly presents it as a no-argument call. There is no parameter semantics to elaborate, so the baseline of 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('test') and resource ('LDAP connection' / Active Directory connectivity) and adds that it also retrieves server status, which is more than a restatement of the name. It is clear what the tool does, but it never distinguishes itself from nearby diagnostic siblings such as health, get_rootdse_info, or get_domain_info.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Useful for troubleshooting and monitoring' implies the context of use but gives no explicit when-to-use versus when-to-use-an-alternative guidance. With several diagnostic siblings present (health, get_tls_posture, get_domain_info), the agent is left to infer which probe to pick.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 45 tool updatesv1.0.0
    • First observedadd_group_member
    • First observedaudit_admin_accounts
    • First observedcreate_computer
    • First observedcreate_group
    • First observedcreate_organizational_unit
    • First observedcreate_user
    • First observeddelete_computer
    • First observeddelete_group
    • First observeddelete_organizational_unit
    • First observeddelete_user
    • First observeddisable_computer
    • First observeddisable_user
    • First observedenable_computer
    • First observedenable_user
    • First observedget_computer
    • First observedget_domain_info
    • First observedget_group
    • First observedget_group_members
    • First observedget_inactive_users
    • First observedget_nested_group_members
    • First observedget_organizational_unit
    • First observedget_organizational_unit_contents
    • First observedget_password_policy_violations
    • First observedget_privileged_groups
    • First observedget_rootdse_info
    • First observedget_schema_info
    • First observedget_stale_computers
    • First observedget_tls_posture
    • First observedget_user
    • First observedget_user_groups
    • First observedget_user_permissions
    • First observedhealth
    • First observedlist_computers
    • First observedlist_groups
    • First observedlist_organizational_units
    • First observedlist_users
    • First observedmodify_computer
    • First observedmodify_group
    • First observedmodify_organizational_unit
    • First observedmodify_user
    • First observedmove_organizational_unit
    • First observedremove_group_member
    • First observedreset_computer_password
    • First observedreset_user_password
    • First observedtest_connection

TDQS

B3.2/5.0

Scored across 45 tools

Disambiguation3/5

Most tools target distinct AD object types and actions, but there is real overlap: get_group_members(recursive=True) and get_nested_group_members both resolve nested membership, and test_connection, health, get_domain_info, get_rootdse_info, and get_tls_posture all report partially overlapping connectivity/domain posture information. list_users/list_computers and get_organizational_unit_contents also overlap on object inventory.

Naming Consistency4/5

The set mostly follows a predictable verb_noun convention: list_*, get_*, create_*, modify_*, delete_*, enable_*, disable_*, add_*, remove_*, reset_*, audit_*. Minor deviations like health and get_schema_info are noticeable but do not make the naming scheme confusing.

Tool Count2/5

45 tools is heavy for an MCP server and exceeds the comfortable range, especially given several overlapping diagnostic and group-membership tools. Active Directory is broad, but this surface could be consolidated to reduce redundancy.

Completeness4/5

The server covers core AD lifecycle operations for users, groups, computers, and OUs, plus memberships, password resets, security auditing, and domain diagnostics. Minor gaps remain such as moving user/computer objects between OUs or richer search/move semantics, but the core administrative and security workflows are well represented.

Maintenance

ActivityMaintained
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    A production-ready MCP server that enables AI assistants to manage enterprise Active Directory environments through 45 specialized tools for users, groups, and GPOs. Its multi-client architecture allows for the secure management of multiple AD domains from a single codebase using natural language commands.
    4
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server that enables AI-powered assessment of Active Directory on-premises environments by exposing AD data as queryable tools for LLMs like Claude.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for read-only LDAP directory operations, enabling search, entry retrieval, schema browsing, and comparison via natural language.
    25 PyPI
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    MCP server that connects Claude Code to LDAP/Active Directory for user lookup, group management, authentication, and role mapping.
    -