import type { UID } from '@strapi/types';
declare const MANY_RELATION_TYPES: Set<string>;
/**
 * Canonical "is this relation a list" predicate for the MCP output boundary.
 * Both the runtime shaping (reduceToIdentity) and the registered output schemas
 * (output-schemas.ts) MUST use this single definition — the MCP SDK validates
 * structuredContent against the schema, so any divergence fails the tool call.
 * Intentionally broader than `relations.isAnyToMany` from @strapi/utils, which
 * ignores `manyWay` and the morph variants.
 */
export declare const isManyRelationForMcp: (attribute: {
    relation?: string;
}) => boolean;
type RelationIdentity = {
    documentId: string;
    locale?: string;
    __type?: string;
    status?: string;
};
/**
 * Reduces a populated relation value to identity-only shape.
 *
 * to-one → { documentId, locale?, __type? } | null
 * to-many → Array<{ documentId, locale?, __type? }>  ([] when empty)
 */
declare const reduceToIdentity: (attribute: {
    relation?: string;
}, value: unknown) => RelationIdentity | RelationIdentity[] | null;
/**
 * Applies identity shaping to all relation fields in a document, including
 * nested fields inside components, dynamic zones, and `localizations`.
 *
 * This covers leak family #1 (relation targets) and #2 (localizations full draft rows)
 * with the same single mechanism.
 */
export declare const shapeRelationsForMcp: (uid: UID.Schema, data: Record<string, unknown>) => Promise<Record<string, unknown>>;
export { reduceToIdentity, MANY_RELATION_TYPES };
//# sourceMappingURL=shape-relations.d.ts.map